Mercurial > public > hwos_code
changeset 560:b7eb98dbd800
bump to 2.96beta (REFACTORED VERSION)
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/README.txt Wed Jan 31 19:39:37 2018 +0100 @@ -0,0 +1,210 @@ +README zu OSTC hwos V2.93 (Neuerungen gegenüber der V2.92x) +=========================================================== + +- Tritt während der Berechnungen im Deko-Kalkulator eine IBCD auf, so wird dies anschließend + auf der Ergebnisseite angezeigt. + +- Die Berechnungen des Deko-Kalkulators können mit der linken Taste abgebrochen werden. + +- Wenn der GF von einem der schnellen Gewebe 1-5 während des Tauchgangs 90% für Gewebe 1, 92% + für Gewebe 2, ... , oder 98% für Gewebe 5 beträgt oder übersteigt, sowie 100% für alle anderen + Gewebe, dann wird eine Mikroblasen-Warnung in rot ausgegeben. Die Warnung bleibt, einmal + ausgelöst, in gelb bis zum Ende des Tauchgangs und weiter im Surface Mode stehen bis die + Entsättigungszeit um ist. + +- Wenn der GF von einem der schnellen Gewebe 1-6 während des Tauchgangs 100% beträgt oder übersteigt, + sowie 102% für Gewebe 7, 104% für Gewebe 8, ..., oder 120% für Gewebe 16, dann wird in rot eine + Warnung ausgegeben dass das ZH-L16-Modell verlassen wurde. Die Warnung bleibt in gelb bis zum Ende + des Tauchgangs stehen. + +- Der Code der übrigen Warnungen aus der V2.92 wurde überarbeitet. + +- Der Zustand der Warnungen wird bei einer Tauchgangs-Simulation und Deko-Berechnung mit in den + Vault gesichert und von dort anschießend wieder hergestellt. + +- Die Berechnung der No-Fly-Zeit wurde überarbeitet, sie wird wie die Entsättigungs-Zeit dem + Luftdruck nachgeführt, der im Oberflächen-Modus angezeigt wird. + + +README zu OSTC hwos V2.92b (Neuerungen gegenüber der V2.91) +========================================================== + +- Die neue Voting-Logic (Sensor-Werte-Mittelung) und die Generierung der Abweichungs-Warnung sind + gegenüber der V2.91 leicht modifiziert und jetzt auch für den Betrieb mit 2 und 3 Sensoren getestet. + +- Die No-Fly-Time Berechnung ist jetzt zum einen effizienter programmiert und orientiert sich zum + anderen nicht mehr an der Regel "60% der Entsättigungszeit" sondern berechnet gemäß den Bühlmann- + Faktoren jetzt die Zeit bis die Gewebe einen Umgebungsdruck von 0,6 bar (No-Fly-Modus) vertragen. + Diesen Wert hat Bühlmann seinen No-Fly-Berechnungen zugrunde gelegt, die Bühlmann-Faktoren a und b + gelten auch bei diesen Umgebungsdrücken. Zusätzlich wird bei aktiviertem GF-Modus der eingestellte + GF-high mit in die Berechnung einbezogen. + +- Im Menu Settings lässt sich anstatt des No-Fly-Modus auch eine Berechnung für Berghöhen von 1000, + 2000 und 3000 Meter auswählen. Die Berechnug der Wartezeit erfolgt dann analog der No-Fly-Berechnung, + nur mit anderen Druckwerten für die jeweiligen Höhen. + +- Die Desat-Time wird nun wie die No-Fly-Time anhand des aktuellen Umgebungdsdrucks laufend neu + berechnet. Das Ergebnis wird für beide Zeiten auf die nächsten vollen 10 Minuten aufgerundet, + da die Zeiten nun nicht mehr in Minuten-Schritten herunterzählen sondern entsprechend des aktuellen + Luftdrucks auch mehrere Minuten vor- und zurück springen können. Die 10-Minuten-Rundung verdeckt + diese Sprünge ein wenig. + +- Die Gewebeanzeige im Divemode ist jetzt eingefärbt: orange dargestellte Gewebe sind aktuell am + aufsättigen, die in cyan dargestellten im Gleichgewicht oder am absättigen. + +- Es wird gemäß dem Ansatz von Burton geprüft, ob in den Geweben eine isobare Gegendiffusion (IBCD) + auftritt. Falls dies im aktuellen Leitgewebe der Fall ist, wird eine Warnung angezeigt. Zusätzlich + wird der aktuelle GF unterhalb der IBCD Warnung angezeigt, so dass mit einem Blick erkennbar ist + ob dieser in Folge der IBCD tatsächlich am steigen ist oder ob sich die Gewebeübersättigung trotz + IBCD in Summe abbaut. + +- Der Code der Temperaturanzeige im Surface- und im Dive-Mode wurde zusammengefasst und behandelt nun + Temperaturen von 0° sowie negative Temperaturen korrekt in beiden Einheiten (°C und °F). + +- Es werden wieder 2 Sprachen unterstützt, aktuell sind die Sprachen-Dateien für Englisch und Deutsch + für die V2.92 verfügbar. Die Anpassung von Spanisch und Französisch ist noch offen. + +- Verschiedene kleine Optimierungen der Funktionen aus V2.91 sowie der Texte und Darstellungen zur + Verbesserung der Lesbarkeit und Verständlichkeit. + +- Speicherstatus: aktuell sind 2.574 Worte Programmspeicher frei. + +- ACHTUNG: die "Testing"-Version der Firmware übernimmt zu Testzwecken die Gewebedaten aus dem !!!!! + !!!! Simulator in den realen Oberflächen- und Tauchmodus! !!!!! + + + +README zu OSTC hwos V2.91 + + +Was ist drin bzw. nicht mehr drin?: +=================================== + +- Die Diveloop ist refactored, d.h. Code-Größe, -Ablauf und -Wartbarkeit sind optimiert. + +- Die Voting Logic für die Sensoren ist komplett neu. Eigentlich gibt es gar kein Voting mehr, alle + aktiven Sensoren werden gemittelt. Wenn sie zu weit auseinander liegen, dann wird eine Warnung + generiert und der Benutzer entscheidet (z.B. mittels Loop-Flush mit bekanntem Gas), welcher/welche + Sensor(en) sinnvolle Werte liefern. Der Sensor bzw. die Sensoren die falsche Werte liefern können + sodann über das Dive-Menu deaktiviert werden. + +- Die "Deko-Engine" (p2_deco.c) ist komplett refactored. Sie kann jetzt zwei voneinander unabhängige Pläne + rechnen. Als besonderen Clou kann sie CCR oder pSCR als Normalplan rechnen und dazu ein OC-Bailout, auf + Wunsch sogar noch mit einem delayed ascent ("Schrecksekunde", Boje schießen, etc.) als Alternativplan. + UND mit Berechnung wie viel Gas das dann brauchen würde, praktisch verständlich angegeben in Bar! + UND mit Vor- und Hauptwarnung wenn eine der benutzten Bailout-Flaschen an ihre Kapazitätsgrenze + kommt! Basis hierfür ist die Eingabemöglichkeit von Flaschengröße und Fülldruck. Die Vorwarnung + kommt wenn der Gasbedarf 70% des Fülldrucks erreicht hat, die Hauptwarnung bei 100%. + In einem neuen Custom-View kann der aktuelle Bailout-Gasbedarf (bzw. normale Deko-Gas-Bedarf beim + OC-Tauchen) jederzeit angesehen werden. Aus Platzgründen können nur vier Gase angezeigt werden, die + Warnungen werden aber auch für das fünfte Gas erzeugt, so denn alle fünf Gase die der Rechner prinzipiell + verwalten kann auch tatsächlich alle im Einsatz sind. Wenn Bailout-Gase als "lost" gesetzt werden und/oder + zwischen GF und aGF umgeschaltet wird, dann wird natürlich alles neu durchgerechnet... + +- Die Dekopläne werden jetzt fast doppelt so schnell berechnet wie zuvor bzw. trotz Berechnung eines + zweiten Planes dauert der Zyklus bis alle Daten jeweils aktualisiert sind nicht länger als vorher. + Die Simulatorfunktionen +5 Minuten und Teile des Deko-Kalkulators sind jetzt deutlich schneller. + +- Es werden nun die CNS% Werte berechnet, wie sie am Ende der Deko und am Ende der fTTS-/Bailout-Deko + sein werden. Die Werte werden über einen Custom-View angezeigt. Erreicht einer der Werte 100% so + wird eine Warnung angezeigt. Der CCR-Taucher kann so frühzeitig reagieren und seinen Setpoint anpassen, + der pSCR-Taucher ggf. auf ein anderes Premix gehen und alle inkl. den OCs ggf. etwas flacher / kürzer tauchen + um die CNS% herunter zu bekommen. + +- Display-Ausgaben: wenn während des Tauchgangs Einstellungen geändert werden die Einfluss auf die + Deko-Daten haben, wie z.B. Setpoint-Wechsel, GF/aGF-Umschaltung, Gaswechsel und lost Gas, dann + werden die Deko-Daten im Display durch eine blaue Farbe als veraltet gekennzeichnet bis diese den + geänderten Einstellungen entsprechend neu berechnet sind. + +- Im Deko-Kalkulator (Simulator) kann nun eingestellt werden mit welchem Setpoint (1-5) er rechnen soll + (CCR-Modus) sowie ob er mit den GF- oder den aGF-Faktoren rechnen soll (alle Modi). So können + verschiedene Deko-Strategien und Notfall-Pläne schnell berechnet und verglichen werden. Die Stopps + und die Gase werden nun eingefärbt, so dass sichtbar ist welches Gas den jeweiligen Stopps zugeordnet + wurde (war ein Wunsch aus dem Forum). + +- Da die Sättigungs-/Entsättigungs-Sicherheitsfaktoren seit der V2.26 auch im GF-Modell verwendet werden, + ist ihre Einstellung nun in 5% statt wie zuvor 10% Schritten und damit feiner möglich. + +- Die Ceiling-Tiefe erscheint jetzt in rot wenn die aktuelle Tiefe kleiner als die Ceiling-Tiefe ist. + +- Es gibt nun eine vierte ppO2-Warnschwelle speziell für den CCR und pSCR Modus: minimaler ppO2 im Loop. + Diese ppO2-Min-Loop Warnschwelle wird beim Atmen aus dem Loop anstelle des "normalen" ppO2-Min benutzt + und kann entsprechend auf höhere ppO2 Werte als Alarmschwelle eingestellt werden. + +- Ebenfalls speziell für den pSCR und CCR Modus gibt es nun eine Limitierung des ppO2 im Loop basierend + auf der aktuellen Tiefe. In z.B. 3 Meter Tiefe sind 1,3 bar ppO2 nie erreichbar, auch wenn der Loop noch + so viel gespült wird: erstens bleiben immer Reste von Inertgasen im Loop hängen und zweitens werden auf + der Deko laufend Inertgase abgeatment, die sich im Loop wiederum ansammeln. + Die Limitierung greift auch, wenn der Sensor-Modus aktiv ist, d.h. auch wenn die Sensoren auf 3 Meter + Tiefe 1,3 bar zeigen würden und ein Limit von z.B. 90% O2 eingestellt ist, dann wird intern trotzdem + nur mit 90/100 * 1,3 = 1,17 bar ppO2 gerechnet. + (Diese Funktion wurde auf Anregung aus dem Forum implementiert) + +- pSCRs werden jetzt in allen Funktionen inkl. des Simulators und der Deko-Berechnung (Stopps, CNS%) korrekt + bezüglich des tiefen-abhängigen ppO2-Drops behandelt. + +- Der pSCR Modus ist jetzt auch in Verbindung mit Sensoren benutzbar. Im Falle eines Fallbacks (wenn alle + Sensoren ausgefallen oder manuell deaktiviert sind) schaltet die Deko-Rechnung vom Sensor-ppO2 auf die + ppO2-Drop-Rechnung zurück. + +- Die graphischen Gewebeanzeigen sind von Halbwertszeiten auf absolute Gewebe-Drücke umgestellt und sehen + nun (hoffentlich) realistischer aus. Die N2-Balken beginnen bei "Null" und zeigen im entsättigten Zustand + (nach einer langen Oberflächenpause) die 0,79 bar ppN2 der Atmosphäre an. Wird in der Deko auf 6 Meter + reiner Sauerstoff geatmet, dann werden die Balken der schnellen Gewebe kürzer als 0,79 bar ppN2. + Da in der Atmosphäre kein nennenswerter Anteil von Helium vorhanden ist, ist die Null-Schwelle der + He-Balken so versetzt dass sie im entsättigten Zustand auf gleicher Höhe liegen wie die N2-Balken. + Die He-Balken haben auch dabei im komplett entsättigten Zustand eine (künstliche) Mindest-Länge, die nur + dafür da ist um ihren Nullpunkt und ihr generelles Vorhandensein sehen zu können. + +- In der Oberflächenmodus-Gewebe-Grafik wird jetzt auch der aktuelle CNS-Wert angezeigt. + +- Auf der ersten Logbuchseite (Grafik) wird jetzt der Tauchgangs-Modus (OC, CC, ...) angezeigt. Weiterhin + sind die Funktionen des linken und des rechten Tasters vertauscht, so dass nun der rechte Taster den + Tauchgang auswählt und dann weiter durch die einzelnen Seiten des Tauchgangs blättert, während der linke + zur Tauchgangsliste zurück springt und die nächsten Tauchgänge wählt. Diese Zuordnung ist bedienfreundlicher + und entspricht der Funktion der Tastenbelegung im Deko-Kalkulator. + +- Im Oberflächenmodus ist die USB Kommunikation jetzt nicht mehr möglich, dafür wird nun der Ladefortschritt + sichtbar. Um USB-Kommunikation zu betreiben muss in den Menu-Modus gewechselt werden. + -> Diese Änderung ist vielleicht nicht (oder zumindest nicht ohne deutlichen Hinweis auf die Änderung) + zum allgemeinen Rollout geeignet, schöner wäre eine Lösung mit einem Timeout... + +- Der Tauchmodus-Custom-View mit den Sensor-mV-Werten ist entfernt. Einerseits um Speicherplatz zu sparen, + andererseits werden die milliVolt-Werte unter Wasser nicht wirklich benötigt da die ppO2-Anzeige bereits + alle Fehlerzustände durch entsprechende Farben kennzeichnet. Allerdings fehlt damit zur Zeit die Anzeige + der HUD-Batteriespannung. Die muss noch irgend wo anders wieder ihren Platz finden (so es denn HUD-Benutzer + gibt die diese Anzeige haben möchten). + +- Ebenso ist der Tauchmodus-Custom-View mit der "Dynamic gaslist" und die dazugehörige Routine TFT_dyn_gaslist + entfernt worden um Speicherplatz zu sparen. Die Gase sind weiterhin über das im Tauchmodus-Menu sichtbar. + +- Aus Gründen des knapp werdenden Speicherplatzes wird nur noch eine Sprache untersützt, derzeit ist dies + Englisch. Ein Wechsel der Sprache ist nur durch Laden einer entsprechenden anders-sprachlichen Firmware + möglich. + + + +Teststatus: +=========== + +- Code-Review ist durchgeführt. + +- Vergleichsläufe mit der V2.26 sind begonnen, hauptsächlich im CCR-Modus. Es müssen noch mehr Tests + durchgeführt werden, insbesondere im OC und pSCR-Modus. + +- Die neue Voting-Logic (Sensor-Werte-Mittelung) und die Generierung der Abweichungs-Warnung sind noch nicht + getestet. + + +Open Items: +=========== + +- Derzeit wird die HUD-Batteriespannung nirgendwo (mehr) angezeigt. + +_______________ +30.10.2017 / rl + + + + + \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/readme-2-95.txt Wed Jan 31 19:39:37 2018 +0100 @@ -0,0 +1,540 @@ + +Doku- & Info-Sammlung zu p2_deco.c und der Einbettung in die V2.95a +=================================================================== + +Bedeutung der Bildschirm-Farben (in der Normaleinstellung): + +grün: feste Kolumnen oder "gute" Zustände. +weiß: Zahlenwerte die im Normalbereich liegen +blau: inaktive Einstellungen und Gase, sowie Werte die noch nicht + berechnet wurden oder die aufgrund von Einstellungsänderungen + (Gaswechsel, LostGas, Setpoint-Wechsel, GF/aGF-Umschaltung, usw.) + nicht mehr aktuell sind und gerade neu berechnet werden. +gelb: Hinweise und Vorwarnungen die zu beachten sind, jedoch noch + kein unmittelbares Handeln erfordern. +rot : Hinweise und Warnungen, die ein unmittelbaren Handeln erfordern. + +Die Schwellen für Vorwarnungen sind generell immer auf 70% eingestellt, +für den aktuellen GF-Wert wird die GF-high Einstellung als Schwelle für +die Vorwarnung benutzt. +Vorwarnungen erscheinen als Warnungstext und/oder als Darstellung in +gelber Farbe. Die endgültige Warnung erscheint dann in roter Farbe. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Die Deco-Engine wird über zwei Parameter kommandiert: + + char_O_main_status: + steuert die Berechnung für die realen Gewebe + + char_O_deco_status: + steuert die Berechnung der Deko/Aufstiegssimulation + +Die Kommandos werden über Flags gegeben. Für beide Kommandoparameter +definert sind: + + DECO_MODE_LOOP: + Wenn gesetzt wird für Kreislaufsysteme gerechnet wenn nicht gesetzt + wird in OC gerechnet. + + DECO_MODE_PSCR: + nur in Verbindung mit DECO_MODE_LOOP, schaltet von CCR auf pSCR um. + +Nur für char_O_deco_status definiert sind: + + DECO_PLAN_ALTERNATE: + Auswahl ob der Normalplan oder ein alternativer Plan gerechnet + werden soll. Von den Ergebnissen des Normal-Plans leiten sich die + meisten Bildschirmanzeigen ab. Vom alternativen Plan werden nur + ausgewählte Daten angezeigt, z.B. die der fTTS oder Bailout- + Berechnung. + + DECO_CNS_CALCULATE: + Wenn aktiviert, wird der CNS%-Wert berechnet wie er am Ende des + Tauchgangs sein wird. Dies kann sowohl im Rahmen des normalen wie + auch des alternativen Plans geschehen, es existieren für beide + Pläne eigene Ausgabevariablen. + + DECO_VOLUME_CALCULATE: + Wenn aktiviert, werden die Gasbedarfe für den gesamten Tauchgang + berechnet. Dies kann sowohl im Rahmen des normalen wie auch des + alternativen Plans geschehen, jedoch existiert für diese Funktion + nur ein gemeinsamer Satz Ausgabevariablen. Wenn DECO_MODE_LOOP + gesetzt ist erfolgen keine Berechnungen, es werden stattdessen + Nullwerte ausgegeben. + + DECO_ASCENT_DELAYED: + Wenn aktiviert wird der Aufstieg / dier Dekompression so berechnet + als ob der Aufstieg nicht sofort, sondern um char_I_extra_time + verzögert beginnt. Die Funktion kann in beiden Plänen verwendet + werden, wird jedoch sinnvoller Weise in Verbindung mit dem + alternativen Plan für fTTS bzw. Bailout-Berechnungen mit delayed + ascent benutzt. + +Die Deco-Engine generiert Warnungen, die in Form von Flags über die +Variable char_O_deco_warnings ausgegeben werden: + + DECO_WARNING_IBCD: + Wird gesetzt wenn das führende Gewebe im Zustand der isobaren + Gegendiffusion ist und derzeit netto tatsächlich am aufsättigen + ist. Auf dem Bildschirm wird unter der IBCD-Warnung zusätzlich + der aktuelle GF angezeigt, der bei Vorliegen dieser Warnung am + steigen ist. + + DECO_WARNING_IBCD_lock: + In diesem Flag wird das Auftreten einer IBCD-Warnung bis über + das Tauchgangsende hinaus gespeichert. Wird im Deko-Kalkulator + benutzt um eine IBCD-Warnung zu geben falls eine solche irgend + wann im Verlaufe der Tauchgangs-Berechnung ausgetreten ist. + + DECO_WARNING_MBUBBLES: + Wird gesetzt, wenn die Gewebe aktuell soweit übersättigt sind + dass mit der Produktion von Mikroblasen gerechnet werden muss. + Achtung: wenn dieses Flag zurückgesetzt wird sind nicht etwa + die Mikroblasen nicht mehr da, es liegen nur vermutlich nicht + mehr die Bedingungen für eine Produktion weiterer Mikroblasen + vor. Der Zustand der aktiven Mikroblasengeneration wird über + eine Mikroblasen-Warnung in Rot dargestellt. + + DECO_WARNING_MBUBBLES_lock: + Wird gesetzt sowie erstmalig während eines Tauchgangs die + Mikroblasen-Warnung gegeben wurde. Bleibt über das Ende des + Tauchgangs hinaus gesetzt bis die Oberflächen-Berechnungen eine + Entsättigung der Gewebe melden. Solange diese Warnung aktiv ist + wird eine Mikroblasen-Warnung in Gelb ausgegeben, sowohl im Tauch- + wie auch im Oberflächen-Modus. + + DECO_WARNING_OUTSIDE: + Wird gesetzt, wenn die Gewebe aktuell soweit übersättigt sind, dass + der Gültigkeitsbereich des ZHL-16 Modells verlassen ist. + Achtung: wenn dieses Flag zurückgesetzt wird ist nicht etwa der + Gültigkeitsbereich des Modells wiederhergestellt, es wird lediglich + weiter gerechnet als ob das Modell noch gelten würde. Inwieweit die + berechneten Werte (Deko-Plan, Ceiling, ...) dann tatsächlich noch + praktische Relevanz haben ist unbekannt und extrem von den + Rahmenbedingungen des Einzelfalls abhängig. + Solange die Gewebesättigungen außerhalb des Modellbereichs sind + wird eine Warnung in Rot ausgegeben. + + DECO_WARNING_OUTSIDE_lock: + Wird zusammen mit DECO_WARNING_OUTSIDE gesetzt und wie bei den + Mikroblasen erst bei Entsättigung wieder gelöscht. + + DECO_WARNING_STOPTABLE_OVERFLOW: + Diese Warnung zeigt an, dass der Tauchgang mehr Stopps erfordert + als in der Stopp-Tabelle gespeichert werden können. Abgeleitete + Werte wie die Aufstiegszeit, die CNS-Werte am Tauchgangsende und + die Gasbedarfe können nicht mehr vollständig ermittelt werden und + werden daher in der Farbe Blau für ungültige Werte dargestellt. Die + wahren Werte sind mindestens so hoch wie die derart angezeigten. + Die Angaben zu den ersten Stopps auf dem Bildschirm und in den + Custom-Views sind jedoch trotzdem korrekt und im weiteren Verlaufe + des Tauchgangs, wenn die ersten Stopps vorüber sind, wird die + Tabelle wieder ausreichen um alle restlichen Stopp-Daten zu + speichern und die Warnung wird zurückgenommen. + Diese Warnung wird nicht direkt angezeigt, sondern nur indirekt + über die ungültig-Kennzeichnung der betroffenen Werte und sollte + bei praktisch durchführbaren Tauchgängen nicht auftreten. + + DECO_FLAG: + Dieses Flag wird gesetzt, wenn mindestens ein Gewebe am absättigen + ist. Mit ihm wird die Warnschwelle für zu hohe ppO2-Werte von der + normalen Schwelle auf die Deko-Schwelle umgeschaltet. Sollte wieder + tiefer getaucht werden (Jo-Jo) so dass alle Gewebe wieder am + aufsättigen sind, dann wird das Flag zurückgenommen und auch die + Warnschwelle wieder zurückgeschaltet. + + +Viele der internen Routinen der Deko-Engine sind generisch ausgelegt und +können sowohl für Berechnungen zu den realen Geweben benutzt werden, als +auch für die Berechnungen im Rahmen des normalen und des alternativen +Aufstiegs-/Dekompressionsplans. Gesteuert wird dies intern über die +Variable tissue_increment, diese besteht aus einem Flag auf der höchsten +Bitposition und einer Interger-Zahl in den Bitstellen darunter +(Wertebereich 0 - 127). Ist das Flag (Bit 7) gesetzt, so werden die +Berechnungen auf die realen Gewebedaten angewendet, andernfalls auf die +von den Plänen simulierten. Mit der Integerzahl wird die Zeitdauer +bestimmt, für die die Berechnung durchgeführt werden soll. Null bedeutet +eine Zeitdauer von 2 Sekunden, die Zahlen von 1 bis 127 stehen für 1 bis +127 volle Minuten. Durch dieses Vorgehen konnten viele Programmabschnitte +deutlich beschleunigt werden. + +Die Deko-Engine wird jede Sekunde aufgerufen und aktualisiert die obigen +sowie weitere Warnungen jede Sekunde bzw. wenn die entsprechenden +Berechnungen durchgeführt wurden. Die Berechnungen für die realen Gewebe +werden jede zweite Sekunde durchgeführt, sekündlich abwechselnd zwischen +der Aktualisierung der Gewebedrücke und des CNS%-Wertes. +Die Aufstiegs- und Dekompressions-Berechnungen werden bei jedem Aufruf +bearbeitet, also in jeder Sekundescheibe. Es wird abwechselnd der Normal- +und der Alternativ-Plan berechnet. +Werden für die Aufstiegsberechnung wesentliche Parameter geändert, wie +z.B. das geatmete oder die verfügbaren Gase, der Setpoint, die GF- +Faktoren, usw., dann wird die laufende Berechnung abgebrochen und im +nächsten Sekunden-Zyklus mit dem nächsten Normalplan begonnen. + +Die Daten zu den Gasen werden von der Assembler-Seite aus über folgende +Funktionen gesetzt: + + Für die Berechnung der realen Gewebe: + + setup_gas_registers: + setzt ein OC-Gas und schaltet den Rechenmodus auf OC + + setup_dil_registers: + setzt ein Diluent und schaltet auf CCR bzw. pSCR Modus + + Für die Aufstiegs-/Dekoplanung: + + deco_setup_oc_gases: + übermittelt die Daten OC-Gase sowie das aktuell geatmete + Gas und schaltet den Rechnenmodus auf OC + + deco_setup_cc_diluents: + übermittelt die Daten der Diluent sowie das aktuell benutzte + Diluent und schaltet auf den CCR bzw. pSCR Modus + +Die Aufstiegs-/Dekoplanung wird über einen Enum in char_O_deco_status +gesteuert: + +- Einmalig am Beginn des Tauchgangs wird der Zustand DECO_STATUS_INIT + aufgerufen, dieser initialisiert die Deco-Engine. Nach Abschluss der + Initialisierung wechselt die Deco-Engine selbsttätig in den Zustand + DECO_STATUS_START weiter. + +- DECO_STATUS_START + startet eine neue Aufstiegs-/Dekoplanung basierend auf den gesetzten + Flags und Gasdaten, falls noch eine Aufstiegs- oder Dekoplanung läuft + wird diese abgebrochen. In diesem Zustand wird auch berechnet ob sich + der Tauchgang noch innerhalb der Nullzeit befindet. Falls ja, endet die + Aufstiegsplanung hier im Zustand ECO_STATUS_FINISHED, ansonsten wird + sie beim nächsten Aufruf der Deco-Engine im Zustand DECO_STATUS_ASCENT + fortgesetzt. + +- DECO_STATUS_ASCENT + führt die Berechnung des Aufstiegs bis zum ersten Deko-Stopp aus + (initial ascent). Im alternativen Planungsmodus werden hierbei auch + Gaswechsel ermittelt. Nach Abschluss der Aufstiegsberechnung wird der + Zustand auf DECO_STATUS_STOPS weitergeschaltet, der dann beim wiederum + nächsten Aufruf der Deco-Engine bearbeitet wird. + +- DECO_STATUS_STOPS + berechnet die Dekostopps und alle weiteren Aufstiege, sowie die CNS%- + Werte am Tauchgangsende und die Gasbedarfe sofern jeweils angefordert. + Diese Berechnungen laufen üblicherweise über mehrere Aufrufzyklen der + Deco-Engine, diese signalisiert am Ende jedes Zykluses mit + DECO_STATUS_STOPS dass (mindestens) ein weiterer Zyklus benötigt wird + oder mit DECO_STATUS_FINISHED dass die Berechnungen abgeschlossen sind. + +- DECO_STATUS_FINISHED + signalisiert, dass die Aufstiegs-/Dekompressionsplanung abgeschlossen + ist und die Ergebnisse in den entsprechenden Variablen bereitstehen + bzw. aktualisiert sind. + Die Kodierung von DECO_STATUS_FINISHED (benutzt als Ausgabe aus der + Deco-Engine) entspricht der Kodierung von DECO_STATUS_START (benutzt + als Eingabe in die Deco-Engine). Die Deco-Engine kann sofort wieder im + Zustand DECO_STATUS_START aufgerufen werden, worauf ein neuer Planungs- + zyklus beginnt. + +Die Einstellungen und Gasdaten können zwischen zwei Planungszyklen (d.h. +zwischen den Zuständen DECO_STATUS_FINISHED und DECO_STATUS_START) ohne +Einschränkungen geändert werden. Während ein Planungszyklus läuft ist +dies nicht zulässig und kann zu falschen Ergebnissen führen. + + +Planungsfunktionen 2nd Deco Plan: + +Über die Deko-Einstellungen, Untermenu "2nd Deco Plan" können erweiterte +sowie alternative Aufstiegs-/Dekompressionsberechnungen aktiviert werden. + + fTTS/Delay: + + Wird hier ein Wert größer Null ausgewählt, dann wird ein zweiter, + alternativer Aufstiegs-/Dekoplan berechnet unter der Annahme, dass + die eingestellte Zeit in Minuten weiterhin auf der aktuellen Tiefe + verbracht wird und erst dann der Aufstieg beginnt. Die unter dieser + Annahme berechnete Aufstiegszeit wird als fTTS (future Time to + Surface) angezeigt. Weiterhin wird der CNS-Wert berechnet, der sich + am Ende eines derart verlängerten Tauchgangs ergeben wird, er kann + über einen CustomView angesehen werden. Wenn dieser CNS-Wert 100% + erreicht wird außerdem eine Warnung ausgegeben. + + Im Bailout-Fall wird keine fTTS-Berechnung durchgeführt, dafür + Erfolgt die Aktualisierung der Bailout-Aufstiegsberechnung dann in + Schnellerer Folge. + + + Calc.Gas(B/O): + + Wird diese Option aktiviert, dann wird der Gasbedarf berechnet, der + für die Beendigung des Tauchgangs unter Einhaltung der Aufstiegs- + geschwindigkeiten und ggf. Dekompressionsstopps benötigt wird. Wenn + bei fTTS/Delay Null eingestellt ist, dann wird diese Berechnung + während der normalen Aufstiegs-/Dekoberechnung durchgeführt und die + ermittelten Werte gelten bei sofortigem Beginn des Aufstiegs. Wenn + bei fTTS/Delay eine Zeit größer Null eingestellt ist, dann wird die + Berechnung im Rahmen des zweiten, alternativen Plans durchgeführt + Und die berechneten Gasbedarfe gelten für den verzögerten Aufstieg. + + + fTTS/Delay und Calc.Gas(B/O) im Modus CCR und pSCR: + + Das oben beschriebene Verhalten verändert sich, wenn sich der OSTC + im CCR oder im pSCR Modus befindet: Wenn die Option Calc.Gas(B/O) + ausgeschaltet ist, dann gelten die berechnete Aufstiegszeit und der + CNS-Wert unter der Annahme dass bis zum Ende des Tauchgangs weiterhin + vom Kreislaufgerät geatmet wird. + Wenn die Option Calc-Gas(B/O) hingegen eingeschaltet ist, dann wird + die Aufstiegszeit und der CNS-Wert unter der Annahme berechnet, + dass ab sofort ein Bailout erfolgt, auf dem ersten Bailoutgas für + die bei fTTS/Delay eingestellte Zeit auf der aktuellen Tiefe + verblieben wird und dann ein Bailout-Aufstieg eingeleitet wird. + Die sich so ergebende Aufstiegszeit wird als B/O-Zeit (BailOut) + angezeigt und die berechneten Gasmengen gelten für die OC-Bailout- + Gase. + + + Bottom Gas, Deco Gas: + + Hier werden die Gasbedarfe in Litern pro Minute Oberflächenrate + (SAC) eingestellt. Diese Einstellungen werden auch vom Deko- + Kalkulator benutzt, der über das Simulations-Menu zu erreichen ist. + + + Tank Sizes: + + Hier sind die Größen der Tanks für die OC-/Bailout-Gase in Litern + (Wasservolumen) einzustellen. Diese Einstellungen sind wichtig, da + sie für die Berechnung der Gasbedarfe im Tauchmodus benötigt + werden: Im Tauchmodus erfolgt die Ausgabe der benötigten Gasmengen + in Bar, bezogen auf die jeweiligen Flaschengrößen. + + + Tank Press Budget: (ex Tank Fill Press) + + Hier wird festgelegt wie viel Gas aus den jeweiligen Tanks (Flaschen) + für den Tauchgang verwendet werden darf. Die Einstellung erfolgt in + Bar Flaschendruck. Erreicht der Bedarf eines Gases 70% des für das + Gas eingestellten Budgets, dann erfolgt eine Warnung in gelber Farbe. + Bei 100% erscheint die Warnung in roter Farbe. + Die benötigten Flaschendrücke können jederzeit über einen CustomView + eingesehen werden. Dieser zeigt aufgrund der begrenzten Bildschirm- + fläche nur die Bedarfe von bis zu vier Gasen an, die Warnungen werden + jedoch für alle 5 Gas erzeugt. + Alle Gasbedarfs- und Druckberechnungen erfolgen unter der Annahme + idealer Gase und ohne Betrachtung von temperaturbedingten Druck- + änderungen. + + +Gaswechsel: + +Im Rahmen der Deko-Pläne werden automatisch Gaswechsel eingeplant, wenn +ein besseres Gas verfügbar ist. Ein besseres, bzw. das beste Gas ist +dasjenige Gas, dessen Wechseltiefe am dichtesten unterhalb der aktuellen +Tiefe liegt. Nur aktivierte Gase die nicht als "Lost" markiert sind +werden berücksichtigt. Gaswechsel werden als Stopp in die Stopp-Tabelle +eingetragen. Die Dauer dieser Stopps beträgt standardmäßig 1 Minute. +Sollte auf der Stopp-Stufe für den Gaswechsel auch ein Dekompressions- +Stopp notwendig sein, so addiert sich die notwendige Stoppzeit für die +Dekompression zu der für den Gaswechsel hinzu. + +Im Bereich zwischen der Grundtiefe und dem ersten Dekompressions-Stopp +werden die Gaswechsel-Stopps auf die Tiefen gelegt, ab denen jeweils +bessere Gase verfügbar werden. Gibt es ein besseres Gas auf der aktuellen +Tiefe, so wird ein Wechsel auf der aktuellen Tiefe geplant. Dies geschieht +jedoch nur im Modus alternativer Plan und nur wenn das nächste bessere +Gas nicht in <= 1 Minute Aufstiegszeit erreicht wird. In Normal-Plan +werden Wechsel auf ein besseres Gas erst ab dem ersten echten Deko-Stopp +eingeplant. +Im Falle, dass im alternativen Plan ein Bail-Out Szenario gerechnet wird +sieht die Gaswahl- und Gaswechsel-Strategie wie folgt aus: zunächst wird +dasjenige OC-Gas gewählt welches als 'First' konfiguriert ist. Auf diesem +wird auf aktueller Tiefe für die Zeit verblieben, die als Delayed-Acent- +Time eingestellt ist. Dann erfolgt die Suche nach einem besseren Gas, auf +das je nach Verfügbarkeit im direkten Anschluss oder während des +initialen Aufstiegs gewechselt wird. Ab Erreichen des ersten Dekostopps +werden Gaswechsel in beiden Plänen (normaler und alternativer Plan) +automatisch ermittelt und immer auf die nächsten passenden Dekostopps +gelegt. Im CCR und im pSCR Modus werden derzeit keine automatischen +Gaswechsel berechnet. + +-> Die Gaswechselzeit ist bereits in der Options-Tabelle angelegt, wird + aber momentan noch innerhalb von p2_deco.c auf 1 Minute erzwungen. + +Die Deko-Engine plant den Aufstieg mit einer einstellbaren Aufstiegs- +geschwindigkeit von 5-10 Meter pro Minute, diese wird über eine Option in +der Options-Tabelle eingestellt. + +-> Die Aufstiegsgeschwindigkeit ist bereits in der Options-Tabelle + angelegt, wird aber momentan noch innerhalb von p2_deco.c auf 10 m/min + erzwungen. + +Für die Ceiling-Berechnung ist eine neue Codezeile angelegt die dafür +sorgt, dass die Ceiling genau dann zu Null wird, wenn auch die TTS zur +NDL umschaltet. Bisher wird so gerundet, dass die Ceiling zu Null wird +während noch eine TTS angezeigt wird. Die neue Zeile ist noch +auskommentiert und die alte Formel in Betrieb um eine Vergleichbarkeit +der gesamten Berechnungen mit der V2.27 zu ermöglichen. Zur Release- +Version sollte entsprechend umkommentiert werden. + + +Gasbedarfs-Berechnung: + +Es werden die Bedarfe aller Gase berechnet, die bei der Aufstiegs-/ +Dekompressionsberechnung eingeplant wurden. Es sind diese die Gase 1 +bis 5. Wird aktuell ein manuell konfiguriertes Gas ("Gas 6") geatmet, +so wird dieses in der Gasbedarfsberechnung außen vor gelassen. Die +Berechnung teilt sich in die Bereiche bottom und initial ascent, stops +und intermediate ascents sowie final ascent. + +Im Bereich bottom und initial ascent wird die Bottom-Verbrauchsrate +angesetzt, in den übrigen Bereichen die Deko-Verbrauchsrate. +Die Aufstiegssegmente werden mit der konfigurierten Aufstiegsrate (5-10 +m/min) berechnet, der final ascent vom letzten Stopp bis zur Oberfläche +mit 1 Meter/Minute. Gibt es keine Stopps, dann reicht der initial ascent +vom Bottom bis zur Oberfläche und wird mit der konfigurierten Aufstiegs- +rate gerechnet, zuzüglich eines Sicherheitsstopps von 3 Minuten auf 5 +Metern. Wenn es keinen Deko-Stopp gibt, aber einen Gaswechsel-Stopp der +tiefer liegt als ein letzter regulärer Deko-Stopp liegen würde, dann wird +der Aufstieg geteilt in einen intermediate ascent und einen final ascent. +Für beide werden dann die entsprechenden Aufstiegsraten angesetzt. + +Alle Gaswechsel werden der Stopp-Tabelle entnommen, daher sind dort +auch reine Gaswechsel-Stopps eingetragen, d.h. Stopps auf denen keine +Dekompression notwendig ist. Auf den Stopps die einen Gaswechsel +beinhalten wird der Gasbedarf wie folgt berechnet: Der Bedarf für die +gesamte Stoppdauer wird dem neuen Gas zugerechnet, für die konfigurierte +Gaswechsel-Dauer wird ein entsprechender Bedarf zusätzlich auf das alte +Gas aufgeschlagen. So ist sichergestellt, dass die berechneten Gasvolumina +genügend Reserve ausweisen um auf einem Gaswechsel-Stopp die Zeit zu haben +das neue Gas verfügbar zu machen (Stage-Handling). + +Die Gasbedarfe werden zum einen in Litern berechnet, diese Werte werden +vom Deko-Kalkulator genutzt, und zum anderen in bar Flaschendruck +entsprechend der eingestellten Flaschengrößen. Hierbei wird mit idealen +Gasen gerechnet, sprich Druck = benötigtes Volumen / Flaschengröße. +Aus dem Vergleich von berechnetem Druckbedarf und konfiguriertem +Flaschendruck werden die Vorwarnung (70%, gelb) und die Hauptwarnung +(100%, rot) generiert. Um bei der Hauptwarnung noch eine minimale Reserve +zu haben sollte daher der Flaschendruck etwas niedriger eingestellt +werden als er tatsächlich ist. + + +Gewebegrafik: + +Die Gewebegrafik ist so skaliert, dass die Länge der Balken dem Druck des +Jeweiligen Inertgases entspricht. Während des Tauchgangs werden die +Balken zusätzlich eingefärbt, die Farbe kennzeichnet ob das Gewebe gerade +am aufsättigen oder am entsättigen ist. Die Balken für den Stickstoff +beginnen weiter links da die Gewebe im Ausgleichzustand an der Oberfläche +bereits zu einem Teil Stickstoff enthalten, nicht jedoch Helium. So +beginnen die "Überdrücke" aus dem Ausgleichszustand heraus auf gleicher +Linie. + + +Stopp-Tabelle (Deko-Tabelle): + +Der Funktionsaufruf ist so verändert, dass beim Aufruf die Menge +der einzutragenden Minuten übergeben werden kann. Diese werden dann auf +den bestehenden Stopp aufaddiert bzw. es wird ein neuer Stopp angelegt. +Es können auch Null Minuten übergeben werden und so ein Stopp "on the +fly" erzeugt werden, z.B. für einen reinen Gaswechsel. Alle Operationen +auf der Stopp-Tabelle sind angepasst um mit Stopps von Null-Dauer zu +funktionieren. +Ein Stopp-Eintrag kann maximal 99 Minuten Stoppdauer aufnehmen. Dauert +ein Stopp länger, so wird eine weiterer Stopp auf gleicher Tiefe angelegt. + + +No-Fly bzw. Altitude-Wait-Zeit: + +Diese Wartezeit wird wie eine Dekompression aus dem aktuellen Gewebe- +zustand heraus auf eine fiktive Tiefe gerechnet, die der gewählten +Höhenstufe entspricht. Für No-Fly wird dabei ein Kabinendruck von 0,6 +bar angesetzt. Der Rechenaufwand für diese Berechnung wird die die +Verwendung eines iterativen Optimierungs-Algorithmus wesentlich +reduziert. Der aktuelle Umgebungsdruck wird laufend in die Berechnung +einbezogen, die sich ergebene Zeit auf volle 10 Minuten gerundet +ausgegeben. + + +Entsättigungszeit: + +Die Entsättigungzeit ist so definert dass der Rest-Stickstoffdruck in +allen Geweben maximal 5% des Gewebedrucks aus natürlicher Sättigung +(Atmung von Luft unter aktuellem Umgebungsdruck) entspricht. Der sich +ergebene Druckwert wird dann ebenfalls für das Rest-Helium angesetzt. +Der aktuelle Umgebungsdruck wird laufend in die Berechnung einbezogen, +die sich ergebene Zeit auf volle 10 Minuten gerundet ausgegeben. + + +pSCR Modus: + +Neben dem CCR-Modus wird nun auch der pSCR-Modus vollständig unterstützt, +inklusive optionalen Sensoren. Die Bedienung und die Menus sind weitest- +gehend identisch, nur dort wo im CCR-Modus zwischen den Setpoints und +Sensorbetrieb ausgewählt wird befindet sich im pSCR-Modus die Auswahl +zwischen Sensorbetrieb und berechneten ppO2-Werten. + + +Handling von Gas 6: + +In der bisherigen Implementierung wurden Änderungen an den O2- und He- +Prozenten des Gases 6 sofort an die Berechnungen für die realen Gewebe +innerhalb von p2_deco.c übergeben, ohne dass dazu der dedizierte Menu- +Eintrag welcher die Zusammensetzung von Gas 6 anzeigt explizit ausgewählt +werden musste. Ebenso wurde das Gas6-Event ausgelöst sowie einer der +Prozentwerte verstellt wurde. In den Teil von p2_deco.c, der die Deko- +Berechnungen ausführt, wurden die Werte von Gas 6 jedoch erst übernommen, +wenn besagter Menu-Eintrag ausgewählt wurde, was in der Praxis zu +Diskrepanzen führen muss. + +In der jetzigen Implementierung werden die O2- und He-Prozentwerte erst +dann übernommen und als Gas 6 aktiviert, wenn der Gas6-Menueintrag +explizit ausgewählt wird. Die Übernahme erfolgt sodann konsistent in die +Berechnung sowohl der realen Gewebe als auch in die Dekoberechnung, und +auch das Gas6-Event wird erst dann gesetzt. + + +Deko-Kalkulator: + +Der Deko-Kalkulator benutzt die Gasverbrauchsraten, die im Deko-Menu, +Untermenu "2nd Deco Plan" eingestellt sind. Über das Menu "Calculator +Setup" kann eingestellt werden, welcher CCR Setpoint für die Berechnungen +benutzt werden soll (nur relevant im CCR Modus) und ob die normalen oder +die alternativen (aGF) GF-Faktoren für die Dekoberechnung benutzt werden +sollen (gilt für alle Modi). Der Deko-Kalkulator ermittelt die benötigten +Gasmengen in Litern (exakt: Barlitern). +Kommt es aufgrund der benutzen Gase und des Deko-Profils zu einer IBCD, +dann wird auf der Ergebnisseite eine entsprechende Warnung ausgegeben. +Erfordert die Dekompression mehr Stopps als im OSTC gespeichert werden +können, dann wird die Deko-Berechnung abgebrochen und eine "incomplete" +Warnung ausgegeben. Die angezeigte Aufstiegszeit, der CNS-Wert und die +ermittelten Gasbedarfe gelten nur bis zum Ende der angezeigten Stopps. +Achtung: Die tatsächlichen Werte bis zum Erreichen der Oberfläche können +unter Umständen deutlich größer sein als die angezeigten, da insbesondere +die letzten Stopps (die nicht mehr berücksichtigt werden konnten) typisch +am längsten dauern! Dieser Fall sollte jedoch bei Profilen praktisch +durchführbarer Tauchgängen nicht auftreten. + + +"DECO ZONE" and GF-"Ampel" + +Sobald beim Aufstieg mindestens ein Gewebe beginnt abzusättigen erscheint +auf der Anzeige "DECO ZONE" in grüner Schrift. Ab diesem Zeitpunkt wird +auch die Warnschwelle für den ppO2 von der normalen Max-Schwelle auf die +Deco-Max-Schwelle umgestellt. Sollte wieder tiefer getaucht werden und +keines der Gewebe mehr absättigen, so verschwindet die Anzeige "DECO +ZONE" wieder und auch die ppO2 Warnschwelle wird wieder auf den normalen +Max-Wert zurück geschaltet. +Überschreitet während des Aufenthalts in der DECO ZONE der aktuelle GF- +Wert den eingestellten Wert für den GF-high, dann erscheint anstatt des +Textes "DECO ZONE" der aktuelle GF-Wert in gelber Farbe. Erreicht oder +überschreitet der aktuelle GF-Wert 100%, dann wird dieser in roter Farbe +angezeigt. + + +Allgemeines: + +Der Quellcode von p2_deco.c ist in bezüglich Lesbarkeit und Kommentierung +überarbeitet, alle Variablen in p2_deco.c und shared_definitions.h sind +funktional gruppiert und ebenfalls vollständig kommentiert. In diversen +Assembler-Quellcode-Dateien wurde ebenfalls die Kommentierung verbessert.
--- a/src/Fonts/aa_font90.inc Wed Dec 27 14:34:11 2017 +0100 +++ b/src/Fonts/aa_font90.inc Wed Jan 31 19:39:37 2018 +0100 @@ -316,49 +316,4 @@ DB 0x20, 0x19, 0x40, 0x60, 0x9D, 0x40, 0x20, 0x13 DB 0x20, 0x40, 0x60, 0xA3, 0x60, 0x41, 0x21, 0x06 DB 0x21, 0x42, 0x60, 0xFF, 0xFF, 0xB5 -; : colon - DB 0xFF, 0xFF, 0xB5, 0x1F, 0x02, 0x96, 0x1F, 0x02 - DB 0x96, 0x1F, 0x02, 0x96, 0x1F, 0x02, 0x96, 0x42 - DB 0x61, 0x41, 0x07, 0x33, 0x99, 0x40, 0x05, 0x41 - DB 0x60, 0xAD, 0x60, 0x04, 0x40, 0x60, 0xB0, 0x40 - DB 0x03, 0x20, 0x60, 0xB1, 0x60, 0x03, 0x20, 0xB3 - DB 0x40, 0x03, 0x60, 0xB3, 0x04, 0xB4, 0x04, 0x40 - DB 0xB3, 0x05, 0x41, 0x60, 0xB0, 0x40, 0x1F, 0x02 - DB 0x96, 0x1F, 0x02, 0x97, 0x20, 0x1F, 0x00, 0x98 - DB 0x60, 0x41, 0x21, 0x1B, 0x9A, 0x60, 0x40, 0x20 - DB 0x05, 0x21, 0x53, 0x98, 0x60, 0x20, 0x04, 0x20 - DB 0x40, 0x60, 0xAE, 0x40, 0x04, 0x40, 0x60, 0xB0 - DB 0x40, 0x03, 0x20, 0x60, 0xB1, 0x60, 0x03, 0x20 - DB 0xB3, 0x40, 0x03, 0x60, 0xB3, 0x04, 0xB4, 0x04 - DB 0x60, 0xB3, 0x05, 0x40, 0x61, 0xB0, 0x20, 0x1F - DB 0x02, 0x95, 0x60, 0x1F, 0x02, 0x96, 0x60, 0x1F - DB 0x01, 0x98, 0x40, 0x1F, 0x9A, 0x60, 0x42, 0x3A - DB 0xFF, 0xEA -; ; semicolon - DB 0x93, 0x04, 0xB4, 0x04, 0xB4, 0x04, 0xB4, 0x04 - DB 0xB4, 0x04, 0xB4, 0x04, 0xB4, 0x04, 0xA8, 0x60 - DB 0x41, 0x21, 0x1F, 0x06, 0x8B, 0x60, 0x20, 0x1F - DB 0x0B, 0x8A, 0x40, 0x1F, 0x0D, 0x89, 0x20, 0x1F - DB 0x0E, 0x88, 0x20, 0x1F, 0x0F, 0x87, 0x40, 0x07 - DB 0x20, 0x47, 0x04, 0x5A, 0x87, 0x20, 0x04, 0x20 - DB 0x40, 0x89, 0x04, 0xA1, 0x60, 0x04, 0x40, 0x8B - DB 0x04, 0xA1, 0x40, 0x03, 0x20, 0x8C, 0x04, 0xA1 - DB 0x20, 0x03, 0x40, 0x8C, 0x04, 0xA1, 0x20, 0x03 - DB 0x60, 0x8C, 0x04, 0xA1, 0x04, 0x8D, 0x04, 0xA1 - DB 0x04, 0x8D, 0x04, 0xA1, 0x04, 0x8D, 0x04, 0xA1 - DB 0x04, 0x8D, 0x04, 0xA1, 0x20, 0x03, 0x60, 0x8C - DB 0x04, 0xA1, 0x20, 0x03, 0x60, 0x8C, 0x04, 0xA1 - DB 0x40, 0x03, 0x40, 0x8C, 0x04, 0xA1, 0x60, 0x03 - DB 0x20, 0x80, 0x60, 0x4A, 0x04, 0x54, 0x61, 0x8A - DB 0x60, 0x20, 0x42, 0x60, 0x80, 0x40, 0x1F, 0x07 - DB 0x20, 0x40, 0x8E, 0x20, 0x1F, 0x0A, 0x60, 0x8B - DB 0x60, 0x1F, 0x0C, 0x40, 0x8A, 0x40, 0x1F, 0x0D - DB 0x60, 0x89, 0x20, 0x1F, 0x0D, 0x20, 0x96, 0x04 - DB 0x92, 0x61, 0x40, 0x07, 0x60, 0x95, 0x04, 0x96 - DB 0x40, 0x05, 0x40, 0x95, 0x04, 0x97, 0x40, 0x04 - DB 0x20, 0x95, 0x04, 0x98, 0x04, 0x20, 0x95, 0x04 - DB 0x98, 0x40, 0x04, 0x95, 0x04, 0x98, 0x60, 0x04 - DB 0x95, 0x04, 0x98, 0x60, 0x04, 0x95, 0x04, 0x98 - DB 0x60, 0x03, 0x20, 0x95, 0x04, 0x98, 0x40, 0x03 - DB 0x20, 0x81 -; TOTAL COMPRESSED SIZE = 2673 +
--- a/src/Fonts/aa_font90_idx.inc Wed Dec 27 14:34:11 2017 +0100 +++ b/src/Fonts/aa_font90_idx.inc Wed Jan 31 19:39:37 2018 +0100 @@ -1,9 +1,9 @@ ;========================================================================== ; Font index exported ven. janv. 13 2012 by FontIO.cpp 110 2011-06-07 11:26:40Z gascuel $ ;========================================================================== -aa_font90_chars EQU .14 +aa_font90_chars EQU .12 aa_font90_firstChar EQU '.' -aa_font90_lastChar EQU ';' +aa_font90_lastChar EQU ':' ; aa_font90_idx: DW aa_font90_bits + 0x0000 ; . dot @@ -18,6 +18,5 @@ DW aa_font90_bits + 0x061F ; 7 7 DW aa_font90_bits + 0x06D3 ; 8 8 DW aa_font90_bits + 0x080F ; 9 9 - DW aa_font90_bits + 0x0925 ; : colon - DW aa_font90_bits + 0x09A7 ; ; semicolon - DW aa_font90_bits + 0x0A71 ; END OF INDEX + DW aa_font90_bits + 0x0925 ; END OF INDEX +
--- a/src/aa_fonts.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/aa_fonts.asm Wed Jan 31 19:39:37 2018 +0100 @@ -12,7 +12,7 @@ ;============================================================================= ;---- TINY font description and data ---------------------------------------- -fonts_data CODE_PACK +fonts_data CODE_PACK 0x11000 ; <- Make sure all three fonts are in the same 64kByte page... global aa_font16_block @@ -150,8 +150,6 @@ global aa_font90_block aa_font90_block: DB ' ', 0x2F - DB 'm', 0x3A - DB 'f', 0x3B DB 0 DB aa_font90_firstChar DB aa_font90_chars
--- a/src/calibrate.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/calibrate.asm Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File calibration.asm +; File calibration.asm REFACTORED VERSION V2.91 ; ; o2 sensor calibration subroutines ; @@ -15,9 +15,9 @@ calibrate CODE - global check_sensors ; Check O2 sensor thresholds for fallback and voting logic + global check_sensors ; Check O2 sensor thresholds for fallback and voting logic check_sensors: - ; Check min_mv + ; Check min_mv movff o2_mv_sensor1+0, sub_a+0 movff o2_mv_sensor1+1, sub_a+1 movlw LOW min_mv @@ -50,7 +50,8 @@ bsf use_O2_sensor3 ;=1: Use this sensor for deco btfsc neg_flag bcf use_O2_sensor3 ;=1: Use this sensor for deco - ; Check max_mv + + ; Check max_mv movff o2_mv_sensor1+0, sub_a+0 movff o2_mv_sensor1+1, sub_a+1 movlw LOW max_mv @@ -94,7 +95,7 @@ bra check_sensor3 ; Check for voting logic check_sensor2: -; Copy disable flags from internal calibration routine + ; Copy disable flags from internal calibration routine btfss sensor1_calibrated_ok bcf use_O2_sensor1 btfss sensor2_calibrated_ok @@ -102,42 +103,43 @@ btfss sensor3_calibrated_ok bcf use_O2_sensor3 check_sensor3: ; Check for voting logic - bsf voting_logic_sensor1 - movff o2_ppo2_sensor1,temp1 - rcall check_sensor_voting_common - incfsz WREG ; Was Wreg=255? - bcf voting_logic_sensor1 ; Yes, ignore this sensor - bsf voting_logic_sensor2 - movff o2_ppo2_sensor2,temp1 - rcall check_sensor_voting_common - incfsz WREG ; Was Wreg=255? - bcf voting_logic_sensor2 ; Yes, ignore this sensor - bsf voting_logic_sensor3 - movff o2_ppo2_sensor3,temp1 - rcall check_sensor_voting_common - incfsz WREG ; Was Wreg=255? - bcf voting_logic_sensor3 ; Yes, ignore this sensor + ; DELETE - voting is done in calc_deko_divemode_sensor ## voting logic + ; bsf voting_logic_sensor1 + ; movff o2_ppo2_sensor1,temp1 + ; rcall check_sensor_voting_common + ; incfsz WREG ; Was Wreg=255? + ; bcf voting_logic_sensor1 ; Yes, ignore this sensor + ; bsf voting_logic_sensor2 + ; movff o2_ppo2_sensor2,temp1 + ; rcall check_sensor_voting_common + ; incfsz WREG ; Was Wreg=255? + ; bcf voting_logic_sensor2 ; Yes, ignore this sensor + ; bsf voting_logic_sensor3 + ; movff o2_ppo2_sensor3,temp1 + ; ;rcall check_sensor_voting_common + ; incfsz WREG ; Was Wreg=255? + ; bcf voting_logic_sensor3 ; Yes, ignore this sensor return - -check_sensor_voting_common: - movf temp1,W - cpfsgt sensor_setpoint - bra check_sensor_voting_common2 ; temp1<sensor_setpoint - ; temp1>sensor_setpoint - movf temp1,W - subwf sensor_setpoint,W - movwf temp1 -check_sensor_voting_common1: - movlw sensor_voting_logic_threshold ; Threshold in 0.01bar - cpfsgt temp1 - retlw .255 ; Within range - retlw .0 ; Out of range -check_sensor_voting_common2: - ; temp1<sensor_setpoint - movf sensor_setpoint,W - subwf temp1,F - bra check_sensor_voting_common1 +; DELETE COMPLETE FUNTION, PARTS OF THE CODE HAVE MIGRATED TO calc_deko_divemode_sensor ## voting logic +; check_sensor_voting_common: + ; movf temp1,W + ; cpfsgt sensor_setpoint + ; bra check_sensor_voting_common2 ; temp1<sensor_setpoint + ; ; temp1>sensor_setpoint + ; movf temp1,W + ; subwf sensor_setpoint,W + ; movwf temp1 +; check_sensor_voting_common1: + ; movlw sensor_voting_logic_threshold ; Threshold in 0.01bar + ; cpfsgt temp1 + ; retlw .255 ; Within range + ; retlw .0 ; Out of range +; check_sensor_voting_common2: + ; ; temp1<sensor_setpoint + ; movf sensor_setpoint,W + ; subwf temp1,F + ; bra check_sensor_voting_common1 global calibrate_mix calibrate_mix: @@ -157,12 +159,12 @@ movff WREG,TXREG2 call rs232_wait_tx2 - movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2 + movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2 addwf temp1,F movff WREG,TXREG2 call rs232_wait_tx2 - movff amb_pressure+0,WREG ; Ambient pressure + movff amb_pressure+0,WREG ; Ambient pressure addwf temp1,F movff WREG,TXREG2 call rs232_wait_tx2 @@ -171,15 +173,15 @@ movff WREG,TXREG2 call rs232_wait_tx2 - movff temp1,TXREG2 ; Chksum + movff temp1,TXREG2 ; Chksum call rs232_wait_tx2 calibrate_mix2: - movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2 + movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2 mullw .100 movff PRODL,xA+0 movff PRODH,xA+1 -; (%O2*100)*[ambient,mbar]/100 -> xC + ; (%O2*100)*[ambient,mbar]/100 -> xC movff amb_pressure+0,xB+0 movff amb_pressure+1,xB+1 rcall calibrate_mix2_helper @@ -188,13 +190,13 @@ call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder ; xC= ppO2/mV movff xC+0,opt_x_s1+0 - movff xC+1,opt_x_s1+1 ; Factor for Sensor1 + movff xC+1,opt_x_s1+1 ; Factor for Sensor1 - movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2 + movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2 mullw .100 movff PRODL,xA+0 movff PRODH,xA+1 -; (%O2*100)*[ambient,mbar]/100 -> xC + ; (%O2*100)*[ambient,mbar]/100 -> xC movff amb_pressure+0,xB+0 movff amb_pressure+1,xB+1 rcall calibrate_mix2_helper @@ -203,13 +205,13 @@ call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder ; xC= ppO2/mV movff xC+0,opt_x_s2+0 - movff xC+1,opt_x_s2+1 ; Factor for Sensor2 + movff xC+1,opt_x_s2+1 ; Factor for Sensor2 - movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2 + movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2 mullw .100 movff PRODL,xA+0 movff PRODH,xA+1 -; (%O2*100)*[ambient,mbar]/100 -> xC + ; (%O2*100)*[ambient,mbar]/100 -> xC movff amb_pressure+0,xB+0 movff amb_pressure+1,xB+1 rcall calibrate_mix2_helper @@ -218,11 +220,12 @@ call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder ; xC= ppO2/mV movff xC+0,opt_x_s3+0 - movff xC+1,opt_x_s3+1 ; Factor for Sensor3 + movff xC+1,opt_x_s3+1 ; Factor for Sensor3 bsf sensor1_calibrated_ok bsf sensor2_calibrated_ok bsf sensor3_calibrated_ok ; Set flags prior check + rcall check_sensors ; Check O2 sensor thresholds min_mv and max_mv and set use_02_sensorX flags ; initialise internal calibration flags btfss use_O2_sensor1 ; Sensor out of range? @@ -253,128 +256,134 @@ banksel common return + calibrate_mix2_helper: - call mult16x16 ;xA*xB=xC + call mult16x16 ; xA*xB=xC movlw LOW .100 movwf xB+0 movlw HIGH .100 movwf xB+1 - goto div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder (And return) + goto div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder (And return) + - -compute_ppo2_analog: - call get_analog_inputs - bra compute_ppo2_common +; DELETE COMPLETE FUNTION, PARTS OF THE CODE HAVE MIGRATED TO calc_deko_divemode_sensor ## voting logic +; compute_ppo2_analog: + ; call get_analog_inputs + ; bra compute_ppo2_common - global compute_ppo2 ; compute mv_sensorX and ppo2_sensorX arrays -compute_ppo2: - btfss analog_o2_input ; cR hardware? - return ; No + ; global compute_ppo2 ; compute mv_sensorX and ppo2_sensorX arrays +; compute_ppo2: + ; btfss analog_o2_input ; cR hardware? + ; return ; No - btfss s8_digital ; =1: Digital I/O - bra compute_ppo2_analog ; use analog + ; btfss s8_digital ; =1: Digital I/O + ; bra compute_ppo2_analog ; use analog - ; use digital - btfss new_s8_data_available ; =1: New data frame recieved - return - rcall compute_mvolts_for_all_sensors + ; ; use digital + ; btfss new_s8_data_available ; =1: New data frame recieved + ; return + ; rcall compute_mvolts_for_all_sensors -compute_ppo2_common: - ; o2_mv_sensor1:2 * opt_x_s1:2 = o2_ppo2_sensor1/10000 - movff o2_mv_sensor1+0,xA+0 - movff o2_mv_sensor1+1,xA+1 - movff opt_x_s1+0,xB+0 - movff opt_x_s1+1,xB+1 - rcall compute_ppo2_common_helper - movff xC+0,o2_ppo2_sensor1 ; result in 0.01bar -; ; Set to zero if sensor is not active! -; btfss use_O2_sensor1 -; clrf o2_ppo2_sensor1 +; compute_ppo2_common: + ; ; o2_mv_sensor1:2 * opt_x_s1:2 = o2_ppo2_sensor1/10000 + ; movff o2_mv_sensor1+0,xA+0 + ; movff o2_mv_sensor1+1,xA+1 + ; movff opt_x_s1+0,xB+0 + ; movff opt_x_s1+1,xB+1 + ; rcall compute_ppo2_common_helper + ; movff xC+0,o2_ppo2_sensor1 ; result in 0.01bar +; ; ; Set to zero if sensor is not active! +; ; btfss use_O2_sensor1 +; ; clrf o2_ppo2_sensor1 - ; o2_mv_sensor2:2 * opt_x_s1:2 = o2_ppo2_sensor2/10000 - movff o2_mv_sensor2+0,xA+0 - movff o2_mv_sensor2+1,xA+1 - movff opt_x_s2+0,xB+0 - movff opt_x_s2+1,xB+1 - rcall compute_ppo2_common_helper - movff xC+0,o2_ppo2_sensor2 ; result in 0.01bar -; ; Set to zero if sensor is not active! -; btfss use_O2_sensor2 -; clrf o2_ppo2_sensor2 + ; ; o2_mv_sensor2:2 * opt_x_s1:2 = o2_ppo2_sensor2/10000 + ; movff o2_mv_sensor2+0,xA+0 + ; movff o2_mv_sensor2+1,xA+1 + ; movff opt_x_s2+0,xB+0 + ; movff opt_x_s2+1,xB+1 + ; rcall compute_ppo2_common_helper + ; movff xC+0,o2_ppo2_sensor2 ; result in 0.01bar +; ; ; Set to zero if sensor is not active! +; ; btfss use_O2_sensor2 +; ; clrf o2_ppo2_sensor2 - ; o2_mv_sensor3:2 * opt_x_s1:2 = o2_ppo2_sensor3/10000 - movff o2_mv_sensor3+0,xA+0 - movff o2_mv_sensor3+1,xA+1 - movff opt_x_s3+0,xB+0 - movff opt_x_s3+1,xB+1 - rcall compute_ppo2_common_helper - movff xC+0,o2_ppo2_sensor3 ; result in 0.01bar -; ; Set to zero if sensor is not active! -; btfss use_O2_sensor3 -; clrf o2_ppo2_sensor3 - return ; Done. + ; ; o2_mv_sensor3:2 * opt_x_s1:2 = o2_ppo2_sensor3/10000 + ; movff o2_mv_sensor3+0,xA+0 + ; movff o2_mv_sensor3+1,xA+1 + ; movff opt_x_s3+0,xB+0 + ; movff opt_x_s3+1,xB+1 + ; rcall compute_ppo2_common_helper + ; movff xC+0,o2_ppo2_sensor3 ; result in 0.01bar +; ; ; Set to zero if sensor is not active! +; ; btfss use_O2_sensor3 +; ; clrf o2_ppo2_sensor3 + ; return ; Done. -compute_ppo2_common_helper: - call mult16x16 ;xA:2*xB:2=xC:4 - movlw LOW .1000 - movwf xB+0 - movlw HIGH .1000 - movwf xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - movlw d'1' - addwf xC+0,F - movlw d'0' - addwfc xC+1,F - tstfsz xC+1 ; ppO2 is higher then 2.55bar? - setf xC+0 ; Yes. - return +; compute_ppo2_common_helper: + ; call mult16x16 ;xA:2*xB:2=xC:4 + ; movlw LOW .1000 + ; movwf xB+0 + ; movlw HIGH .1000 + ; movwf xB+1 + ; call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + ; movlw d'1' + ; addwf xC+0,F + ; movlw d'0' + ; addwfc xC+1,F + ; tstfsz xC+1 ; ppO2 is higher then 2.55bar? + ; setf xC+0 ; Yes. + ; return + + global compute_mvolts_for_all_sensors compute_mvolts_for_all_sensors: ; Compute mV or all sensors (S8 Mode) ; compute AD results in 100µV steps (16bit/sensor) ; 24bit AD result is in 244,1406541nV ; Devide 24bit value through 409,5999512 -> 410 (0,01% error) - #DEFINE ad2mv_factor .410 - ; Sensor 1 - clrf xC+3 - movff s8_rawdata_sensor1+2,xC+2 - movff s8_rawdata_sensor1+1,xC+1 - movff s8_rawdata_sensor1+0,xC+0 - movlw LOW ad2mv_factor - movwf xB+0 - movlw HIGH ad2mv_factor - movwf xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - movff xC+1,o2_mv_sensor1+1 - movff xC+0,o2_mv_sensor1+0 ; in 100uV steps - ; Sensor 2 - clrf xC+3 - movff s8_rawdata_sensor2+2,xC+2 - movff s8_rawdata_sensor2+1,xC+1 - movff s8_rawdata_sensor2+0,xC+0 - movlw LOW ad2mv_factor - movwf xB+0 - movlw HIGH ad2mv_factor - movwf xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - movff xC+1,o2_mv_sensor2+1 - movff xC+0,o2_mv_sensor2+0 ; in 100uV steps - ; Sensor 3 - clrf xC+3 - movff s8_rawdata_sensor3+2,xC+2 - movff s8_rawdata_sensor3+1,xC+1 - movff s8_rawdata_sensor3+0,xC+0 - movlw LOW ad2mv_factor - movwf xB+0 - movlw HIGH ad2mv_factor - movwf xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - movff xC+1,o2_mv_sensor3+1 - movff xC+0,o2_mv_sensor3+0 ; in 100uV steps + #DEFINE ad2mv_factor .410 + ; Sensor 1 + clrf xC+3 + movff s8_rawdata_sensor1+2,xC+2 + movff s8_rawdata_sensor1+1,xC+1 + movff s8_rawdata_sensor1+0,xC+0 + movlw LOW ad2mv_factor + movwf xB+0 + movlw HIGH ad2mv_factor + movwf xB+1 + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + movff xC+1,o2_mv_sensor1+1 + movff xC+0,o2_mv_sensor1+0 ; in 100uV steps + ; Sensor 2 + clrf xC+3 + movff s8_rawdata_sensor2+2,xC+2 + movff s8_rawdata_sensor2+1,xC+1 + movff s8_rawdata_sensor2+0,xC+0 + movlw LOW ad2mv_factor + movwf xB+0 + movlw HIGH ad2mv_factor + movwf xB+1 + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + movff xC+1,o2_mv_sensor2+1 + movff xC+0,o2_mv_sensor2+0 ; in 100uV steps + ; Sensor 3 + clrf xC+3 + movff s8_rawdata_sensor3+2,xC+2 + movff s8_rawdata_sensor3+1,xC+1 + movff s8_rawdata_sensor3+0,xC+0 + movlw LOW ad2mv_factor + movwf xB+0 + movlw HIGH ad2mv_factor + movwf xB+1 + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + movff xC+1,o2_mv_sensor3+1 + movff xC+0,o2_mv_sensor3+0 ; in 100uV steps - bcf new_s8_data_available ; Clear flag - return ; Done. + bcf new_s8_data_available ; Clear flag + return ; Done. - global transmit_setpoint ; Transmit current setpoint from WREG (in cbar) to external electronics + + + global transmit_setpoint ; Transmit current setpoint from WREG (in cbar) to external electronics transmit_setpoint: return btfss s8_digital ; S8 Digital? @@ -393,12 +402,12 @@ movff WREG,TXREG2 call rs232_wait_tx2 - movff temp2,WREG ; SP in cbar + movff temp2,WREG ; SP in cbar addwf temp1,F movff WREG,TXREG2 call rs232_wait_tx2 - movff temp1,TXREG2 ; Chksum + movff temp1,TXREG2 ; Chksum call rs232_wait_tx2 return
--- a/src/calibrate.inc Wed Dec 27 14:34:11 2017 +0100 +++ b/src/calibrate.inc Wed Jan 31 19:39:37 2018 +0100 @@ -1,10 +1,19 @@ ;============================================================================= ; -; File calibrate.inc +; File calibrate.inc REFACTORED VERSION V2.91 ; ;============================================================================= - extern compute_ppo2 ; compute mv_sensorX and ppo2_sensorX arrays +; DELETE ## voting logic +; extern compute_ppo2 ; compute mv_sensorX and ppo2_sensorX arrays + extern calibrate_mix ; Calibrate with any mix - extern check_sensors ; Check O2 sensor thresholds for fallback - extern transmit_setpoint ; Transmit current setpoint from WREG (in cbar) to external electronics \ No newline at end of file + +; DELETE ## voting logic +; extern check_sensors ; Check O2 sensor thresholds for fallback + +; ADD ## voting logic + extern compute_mvolts_for_all_sensors ; compute sensor mv values from digital transmitted data + + extern transmit_setpoint ; Transmit current setpoint from WREG (in cbar) to external electronics + \ No newline at end of file
--- a/src/changelog.txt Wed Dec 27 14:34:11 2017 +0100 +++ b/src/changelog.txt Wed Jan 31 19:39:37 2018 +0100 @@ -1,3 +1,7 @@ +[2.96] +- Beta Version - + + [2.27] - Beta Version - BUGFIX: Display of negative (°C) water temperatures
--- a/src/comm.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/comm.asm Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File comm.asm +; File comm.asm REFACTORED VERSION 2.94 ; ; RS232 via USB ; @@ -107,12 +107,12 @@ movlw 0xAA ; start byte=0xAA? cpfseq RCREG1 bra comm_mode2a - bra comm_mode2b ; Startbyte for service mode found + bra comm_mode2b ; Startbyte for service mode found comm_mode2a: movlw 0xBB ; start byte=0xBB? cpfseq RCREG1 bra comm_mode2c - bra comm_download_mode ; Startbyte for download mode found + bra comm_download_mode ; Startbyte for download mode found comm_mode2c: btfss vusb_in ; USB plugged in? @@ -124,33 +124,33 @@ btfsc onesecupdate bra comm_mode1 - bra comm_mode2 ; Cycle + bra comm_mode2 ; Cycle comm_mode2b: ; Startbyte found rcall comm_rs232_wait_tx ; Wait for UART movlw 0x4B - movwf TXREG1 ; Send Answer + movwf TXREG1 ; Send Answer ; Now, check comm command - rcall comm_write_get_byte ; first byte - rcall comm_rs232_wait_tx ; Wait for UART - movff RCREG1,TXREG1 ; Echo + rcall comm_write_get_byte ; first byte + rcall comm_rs232_wait_tx ; Wait for UART + movff RCREG1,TXREG1 ; Echo movlw UPPER comm_service_key cpfseq RCREG1 - bra comm_mode1 ; Wrong -> Restart - rcall comm_write_get_byte ; second byte + bra comm_mode1 ; Wrong -> Restart + rcall comm_write_get_byte ; second byte rcall comm_rs232_wait_tx ; Wait for UART - movff RCREG1,TXREG1 ; Echo + movff RCREG1,TXREG1 ; Echo movlw HIGH (comm_service_key & 0xFFFF) cpfseq RCREG1 - bra comm_mode1 ; Wrong -> Restart - rcall comm_write_get_byte ; third byte + bra comm_mode1 ; Wrong -> Restart + rcall comm_write_get_byte ; third byte rcall comm_rs232_wait_tx ; Wait for UART - movff RCREG1,TXREG1 ; Echo + movff RCREG1,TXREG1 ; Echo movlw LOW comm_service_key cpfseq RCREG1 - bra comm_mode1 ; Wrong -> Restart + bra comm_mode1 ; Wrong -> Restart ; Enable comm service mode WIN_SMALL comm_status2_column, comm_status2_row @@ -171,7 +171,7 @@ WIN_SMALL comm_status3_column, comm_status3_row STRCPY_TEXT_PRINT tUsbExit ; Exited comm_service_exit_common: - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_rs232_wait_tx ; Wait for UART movlw 0xFF ; Reply FF movwf TXREG1 ; Send Answer @@ -202,25 +202,25 @@ ; send firmware to bootloader ; comm_send_firmware: - movlw 0x50 ; send echo + movlw 0x50 ; send echo movwf TXREG1 - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_rs232_wait_tx ; Wait for UART ; Read 5 bytes into buffer. lfsr FSR2,buffer movlw .5 ; counter movwf lo - movlw 0x55 ; 5'ft byte checksum. + movlw 0x55 ; 5'ft byte checksum. movwf hi comm_send_firmware_loop: rcall comm_write_get_byte btfsc rs232_recieve_overflow ; Got byte? - bra comm_send_firmware_abort ; No, abort! + bra comm_send_firmware_abort ; No, abort! movf RCREG1,W - movwf POSTINC2 ; Store checksum byte. - xorwf hi,F ; Also xor into checksum - rlncf hi,F ; And rotate it. + movwf POSTINC2 ; Store checksum byte. + xorwf hi,F ; Also xor into checksum + rlncf hi,F ; And rotate it. decfsz lo,F bra comm_send_firmware_loop @@ -228,14 +228,14 @@ movf hi,W bnz comm_send_firmware_failed - movlw 0x4C ; send OK + movlw 0x4C ; send OK movwf TXREG1 - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_rs232_wait_tx ; Wait for UART ; Passed: goto second stage verification. ; NOTE: Bootloader is Bank0. With buffer at address 0x200. - call vault_decodata_into_eeprom ; Store last deco data (And Time/Date) into EEPROM - goto 0x1FDF0 ; And pray... + call vault_decodata_into_eeprom ; Store last deco data (And Time/Date) into EEPROM + goto 0x1FDF0 ; And pray... comm_send_firmware_failed: WIN_SMALL comm_string_column, comm_string_row @@ -244,7 +244,7 @@ comm_send_firmware_abort: - movlw 0xFF ; send ABORTED byte. + movlw 0xFF ; send ABORTED byte. movwf TXREG1 bra comm_download_mode0 ; Done. @@ -273,9 +273,9 @@ ; erases range in 4kB steps comm_erase_range4kb: - movlw 0x42 ; send echo + movlw 0x42 ; send echo movwf TXREG1 - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_rs232_wait_tx ; Wait for UART bcf INTCON,GIE ; All interrups off! @@ -316,10 +316,10 @@ ;----------------------------------------------------------------------------- -comm_write_range: ; Get 3 bytes start address +comm_write_range: ; Get 3 bytes start address movlw 0x30 ; send echo movwf TXREG1 - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_rs232_wait_tx ; Wait for UART bcf INTCON,GIE ; All interrups off! @@ -330,41 +330,41 @@ comm_write_range_loop: rcall comm_write_get_byte btfsc rs232_recieve_overflow ; Got byte? - bra comm_download_mode0 ; No, Done (and send OK byte too). + bra comm_download_mode0 ; No, Done (and send OK byte too). movf RCREG1,W ; bsf NCTS ; Hold Bluetooth Chip (Requires PC/Android/iOS side to use flow control...) - call ext_flash_byte_write_comms ; write one byte + call ext_flash_byte_write_comms ; write one byte ; bcf NCTS ; Release Bluetooth Chip (Requires PC/Android/iOS side to use flow control...) call incf_ext_flash_address_p1 ; increase address+1 bra comm_write_range_loop ;----------------------------------------------------------------------------- -comm_send_range: ; Get 3 bytes start address and 3 bytes amount +comm_send_range: ; Get 3 bytes start address and 3 bytes amount movlw 0x20 ; send echo movwf TXREG1 - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_rs232_wait_tx ; Wait for UART - bcf INTCON,GIE ; All interrups off! + bcf INTCON,GIE ; All interrups off! rcall comm_get_flash_address ; Get three bytes address or return - btfsc rs232_recieve_overflow ; Got Data? - bra comm_download_mode0 ; No, Done. + btfsc rs232_recieve_overflow ; Got Data? + bra comm_download_mode0 ; No, Done. rcall comm_write_get_byte - btfsc rs232_recieve_overflow ; Got byte? - bra comm_download_mode0 ; No, Done. + btfsc rs232_recieve_overflow ; Got byte? + bra comm_download_mode0 ; No, Done. movff RCREG1,up rcall comm_write_get_byte - btfsc rs232_recieve_overflow ; Got byte? - bra comm_download_mode0 ; No, Done. + btfsc rs232_recieve_overflow ; Got byte? + bra comm_download_mode0 ; No, Done. movff RCREG1,hi rcall comm_write_get_byte - btfsc rs232_recieve_overflow ; Got byte? - bra comm_download_mode0 ; No, Done. + btfsc rs232_recieve_overflow ; Got byte? + bra comm_download_mode0 ; No, Done. movff RCREG1,lo - ; If lo==0, we must precondition hi because there is to many bytes send ! + ; If lo==0, we must precondition hi because there are to many bytes send ! movf lo,W bnz $+4 decf hi,F @@ -379,12 +379,12 @@ call ext_flash_read_block_start movwf TXREG1 - bra comm_send_range24 ; counter 24bit + bra comm_send_range24 ; counter 24bit comm_send_range24_loop: call ext_flash_read_block ; Read one byte movwf TXREG1 ; Start new transmit comm_send_range24: - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_rs232_wait_tx ; Wait for UART decfsz lo,F bra comm_send_range24_loop decf hi,F @@ -423,12 +423,12 @@ WIN_SMALL comm_status2_column, comm_status2_row STRCPY_TEXT_PRINT tUsbDownloadMode; Download mode enabled bsf INTCON,GIE ; All interrups on - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_rs232_wait_tx ; Wait for UART movlw 0xBB ; Command Echo movwf TXREG1 ; Send Answer comm_download_mode0: bsf INTCON,GIE ; All interrups on - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_rs232_wait_tx ; Wait for UART movlw 0x4C ; 4C in service mode btfss comm_service_enabled movlw 0x4D ; 4D in download mode @@ -441,7 +441,7 @@ dcfsnz timeout_counter,F bra comm_service_exit ; Timeout -> Exit comm_download_mode2: - rcall comm_write_get_byte ; Check for a byte + rcall comm_write_get_byte ; Check for a byte btfsc comm_service_enabled btg LEDr ; Blink in Service mode btfss vusb_in ; USB plugged in? @@ -451,7 +451,7 @@ btfsc onesecupdate bra comm_download_mode1 btfsc rs232_recieve_overflow - bra comm_download_mode2 ; Wait for command byte + bra comm_download_mode2 ; Wait for command byte ; command received! bcf LEDr @@ -547,7 +547,7 @@ ; movlw "t" ; cpfseq RCREG1 ; bra $+4 -; goto testloop ; Start raw-data testloop +; goto testloop ; Start raw-data testloop movlw 0xC1 cpfseq RCREG1 bra $+4 @@ -557,7 +557,7 @@ ;----------------------------------------------------------------------------- comm_send_compact_headers: - movlw "m" ; send echo + movlw "m" ; send echo movwf TXREG1 ; Send 13 bytes/dive (Compact Header) ; 1st: 200009h-200016h @@ -580,14 +580,14 @@ addwfc ext_flash_address+2 movlw 0x30 - cpfseq ext_flash_address+2 ; All 256 dive send? - bra comm_send_compact_headers4 ; No, continue - bra comm_download_mode0 ; Done. Loop with timeout reset + cpfseq ext_flash_address+2 ; All 256 dive send? + bra comm_send_compact_headers4 ; No, continue + bra comm_download_mode0 ; Done. Loop with timeout reset comm_send_compact_headers4: movlw .13 movwf lo ; Counter - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_rs232_wait_tx ; Wait for UART call ext_flash_read_block_start ; 1st byte movwf TXREG1 bra comm_send_compact_headers3 ; counter 24bit @@ -595,7 +595,7 @@ call ext_flash_read_block ; Read one byte movwf TXREG1 ; Start new transmit comm_send_compact_headers3: - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_rs232_wait_tx ; Wait for UART decfsz lo,F bra comm_send_compact_headers_loop call ext_flash_read_block_stop @@ -609,21 +609,21 @@ call ext_flash_read_block ; 2nd byte movwf TXREG1 call ext_flash_read_block_stop - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_rs232_wait_tx ; Wait for UART ; Offset to Logbook-Profile version movlw .8 movwf ext_flash_address+0 - call ext_flash_byte_read ; Get byte + call ext_flash_byte_read ; Get byte movwf TXREG1 - rcall comm_rs232_wait_tx ; Wait for UART - bra comm_send_compact_headers2 ; continue + rcall comm_rs232_wait_tx ; Wait for UART + bra comm_send_compact_headers2 ; continue ;----------------------------------------------------------------------------- comm_send_headers: - movlw "a" ; send echo + movlw "a" ; send echo movwf TXREG1 ; Send 256 bytes/dive (Header) ; 1st: 200000h-2000FFh @@ -637,8 +637,7 @@ movwf ext_flash_address+1 comm_send_headers2: - movlw 0x00 - movwf ext_flash_address+0 + clrf ext_flash_address+0 ; Adjust address for next dive movlw 0x10 addwf ext_flash_address+1 @@ -646,33 +645,33 @@ addwfc ext_flash_address+2 movlw 0x30 - cpfseq ext_flash_address+2 ; All 256 dive send? + cpfseq ext_flash_address+2 ; All 256 dive send? bra comm_send_headers4 ; No, continue - bra comm_download_mode0 ; Done. Loop with timeout reset + bra comm_download_mode0 ; Done. Loop with timeout reset comm_send_headers4: clrf lo ; Counter - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_rs232_wait_tx ; Wait for UART call ext_flash_read_block_start ; 1st byte movwf TXREG1 - bra comm_send_headers3 ; counter 24bit + bra comm_send_headers3 ; counter 24bit comm_send_headers_loop: call ext_flash_read_block ; Read one byte movwf TXREG1 ; Start new transmit comm_send_headers3: - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_rs232_wait_tx ; Wait for UART decfsz lo,F bra comm_send_headers_loop call ext_flash_read_block_stop - bra comm_send_headers2 ; continue + bra comm_send_headers2 ; continue ;----------------------------------------------------------------------------- -comm_option_reset_all: ; Reset all options to factory default. - movlw "x" ; send echo +comm_option_reset_all: ; Reset all options to factory default. + movlw "x" ; send echo movwf TXREG1 call option_reset_all - bra comm_download_mode0 ; Done. back to loop with timeout reset + bra comm_download_mode0 ; Done. back to loop with timeout reset ;----------------------------------------------------------------------------- @@ -686,7 +685,7 @@ movlw "b" ; send echo movwf TXREG1 - rcall comm_rs232_wait_tx ; wait for UART + rcall comm_rs232_wait_tx ; wait for UART rcall comm_write_get_byte btfsc rs232_recieve_overflow ; Got byte? bra comm_download_mode0 ; No, abort @@ -737,7 +736,7 @@ comm_set_custom_text: movlw "c" ; send echo movwf TXREG1 - rcall comm_rs232_wait_tx ; wait for UART + rcall comm_rs232_wait_tx ; wait for UART lfsr FSR2,opt_name movlw opt_name_length movwf lo ; counter @@ -765,7 +764,7 @@ comm_identify: movlw "i" ; send echo movwf TXREG1 - rcall comm_rs232_wait_tx ; wait for UART + rcall comm_rs232_wait_tx ; wait for UART ;---- Read serial from internal EEPROM address 0000 clrf EEADRH @@ -810,25 +809,25 @@ comm_hardware_descriptor: movlw "j" ; send echo movwf TXREG1 - rcall comm_rs232_wait_tx ; wait for UART + rcall comm_rs232_wait_tx ; wait for UART movff hardware_flag,TXREG1 bra comm_download_mode0 ; Done. comm_feature_and_hardware: - movlw 0x60 ; send echo + movlw 0x60 ; send echo movwf TXREG1 - rcall comm_rs232_wait_tx ; wait for UART + rcall comm_rs232_wait_tx ; wait for UART movlw 0x00 ; Hardware high byte movwf TXREG1 - rcall comm_rs232_wait_tx ; wait for UART + rcall comm_rs232_wait_tx ; wait for UART movff hardware_flag,TXREG1 - rcall comm_rs232_wait_tx ; wait for UART + rcall comm_rs232_wait_tx ; wait for UART movlw 0x00 ; Feature high Byte movwf TXREG1 - rcall comm_rs232_wait_tx ; wait for UART + rcall comm_rs232_wait_tx ; wait for UART movlw 0x00 ; Feature low Byte movwf TXREG1 - rcall comm_rs232_wait_tx ; wait for UART + rcall comm_rs232_wait_tx ; wait for UART movlw 0x00 ; Model descriptor byte movwf TXREG1 bra comm_download_mode0 ; Done. @@ -841,7 +840,7 @@ rcall comm_write_get_byte btfsc rs232_recieve_overflow ; Got byte? - bra comm_download_mode0 ; No, abort! + bra comm_download_mode0 ; No, abort! movff RCREG1,lo ; Store dive number (0-255) ; First, send the header (again) ; Set ext_flash_address:3 to TOC entry of this dive @@ -854,7 +853,7 @@ movlw 0x20 movwf ext_flash_address+2 movlw .16 - mulwf lo ; lo*16 = offset to 0x2000 (up:hi) + mulwf lo ; lo*16 = offset to 0x2000 (up:hi) movf PRODL,W addwf ext_flash_address+1,F movf PRODH,W @@ -892,16 +891,16 @@ comm_send_dive1: ; Send header - clrf hi ; Counter - rcall comm_rs232_wait_tx ; Wait for UART - call ext_flash_read_block_start ; 1st byte + clrf hi ; Counter + rcall comm_rs232_wait_tx ; Wait for UART + call ext_flash_read_block_start ; 1st byte movwf TXREG1 bra comm_send_dive_header comm_send_dive_header2: - call ext_flash_read_block ; Read one byte - movwf TXREG1 ; Start new transmit + call ext_flash_read_block ; Read one byte + movwf TXREG1 ; Start new transmit comm_send_dive_header: - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_rs232_wait_tx ; Wait for UART decfsz hi,F bra comm_send_dive_header2 call ext_flash_read_block_stop @@ -911,15 +910,15 @@ movff ext_flash_log_pointer+1,ext_flash_address+1 movff ext_flash_log_pointer+2,ext_flash_address+2 - movlw .6 ; Skip 6byte short header in profile - only for internal use - call incf_ext_flash_address0_0x20 ; increases bytes in ext_flash_address:3 with 0x200000 bank switching + movlw .6 ; Skip 6byte short header in profile - only for internal use + call incf_ext_flash_address0_0x20 ; increases bytes in ext_flash_address:3 with 0x200000 bank switching ; Set address for short header/compact header, Byte 0 comm_send_dive_profile: - call ext_flash_byte_read_plus_0x20 ; Read one byte into temp1, takes care of banking at 0x200000 - rcall comm_rs232_wait_tx ; Wait for UART - movff temp1,TXREG1 ; Send a byte + call ext_flash_byte_read_plus_0x20 ; Read one byte into temp1, takes care of banking at 0x200000 + rcall comm_rs232_wait_tx ; Wait for UART + movff temp1,TXREG1 ; Send a byte ; 24bit compare with end address movff convert_value_temp+0,WREG @@ -932,8 +931,8 @@ cpfseq ext_flash_address+2 bra comm_send_dive_profile - rcall comm_read_setting_wait ; Wait for UART - bra comm_download_mode0 ; Done. Loop with timeout reset + rcall comm_read_setting_wait ; Wait for UART + bra comm_download_mode0 ; Done. Loop with timeout reset ;----------------------------------------------------------------------------- @@ -985,9 +984,9 @@ dcfsnz WREG movff char_I_deco_model, TXREG1 ; RCREG1=0x21 dcfsnz WREG - movff opt_ppO2_max, TXREG1 ; RCREG1=0x22 + movff char_I_ppO2_max, TXREG1 ; RCREG1=0x22 MODIFIED ## V2.94 dcfsnz WREG - movff opt_ppO2_min, TXREG1 ; RCREG1=0x23 + movff char_I_ppO2_min, TXREG1 ; RCREG1=0x23 MODIFIED ## V2.94 dcfsnz WREG movff char_I_extra_time, TXREG1 ; RCREG1=0x24 dcfsnz WREG @@ -1017,7 +1016,7 @@ dcfsnz WREG movff opt_dive_color_scheme, TXREG1 ; RCREG1=0x31 dcfsnz WREG - movff opt_language, TXREG1 ; RCREG1=0x32 + movff opt_language, TXREG1 ; RCREG1=0x32 dcfsnz WREG movff opt_dateformat, TXREG1 ; RCREG1=0x33 dcfsnz WREG @@ -1029,7 +1028,7 @@ dcfsnz WREG movff opt_calibration_O2_ratio, TXREG1; RCREG1=0x37 dcfsnz WREG - movff opt_sensor_fallback, TXREG1 ; RCREG1=0x38 + clrf TXREG1 ; RCREG1=0x38 NOT USED ANYMORE (opt_sensor_fallback) ## voting logic dcfsnz WREG movff opt_flip_screen, TXREG1 ; RCREG1=0x39 dcfsnz WREG @@ -1059,26 +1058,61 @@ dcfsnz WREG movff opt_safety_stop_reset, TXREG1 ; RCREG1=0x46 dcfsnz WREG - clrf TXREG1 ; RCREG1=0x47, ignore conservatism for standard hwOS + clrf TXREG1 ; RCREG1=0x47, ignore conservatism for standard hwOS + dcfsnz WREG + movff opt_diveTimeout, TXREG1 ; RCREG1=0x48 + dcfsnz WREG + movff button_polarity, TXREG1 ; RCREG1=0x49 + dcfsnz WREG + movff char_I_PSCR_drop, TXREG1 ; RCREG1=0x4A dcfsnz WREG - movff opt_diveTimeout, TXREG1 ; RCREG1=0x48 + movff char_I_PSCR_lungratio, TXREG1 ; RCREG1=0x4B dcfsnz WREG - movff button_polarity, TXREG1 ; RCREG1=0x49 + movff char_I_ppO2_max_deco, TXREG1 ; RCREG1=0x4C MODIFIED ## V2.94 + + ; NEW + dcfsnz WREG + movff char_I_ppO2_min_loop, TXREG1 ; RCREG1=0x4D ## CCR/pSCR min ppO2 MODIFIED ## V2.94 dcfsnz WREG - movff opt_PSCR_drop, TXREG1 ; RCREG1=0x4A - dcfsnz WREG - movff opt_PSCR_lungratio, TXREG1 ; RCREG1=0x4B - dcfsnz WREG - movff opt_ppO2_max_deco, TXREG1 ; RCREG1=0x4C - - + movff char_I_tank_size+0, TXREG1 ; RCREG1=0x4E ## bailout gas needs + dcfsnz WREG + movff char_I_tank_size+1, TXREG1 ; RCREG1=0x4F ## bailout gas needs + dcfsnz WREG + movff char_I_tank_size+2, TXREG1 ; RCREG1=0x50 ## bailout gas needs + dcfsnz WREG + movff char_I_tank_size+3, TXREG1 ; RCREG1=0x51 ## bailout gas needs + dcfsnz WREG + movff char_I_tank_size+4, TXREG1 ; RCREG1=0x52 ## bailout gas needs + dcfsnz WREG + movff char_I_tank_pres_fill+0, TXREG1 ; RCREG1=0x53 ## bailout gas needs + dcfsnz WREG + movff char_I_tank_pres_fill+1, TXREG1 ; RCREG1=0x54 ## bailout gas needs + dcfsnz WREG + movff char_I_tank_pres_fill+2, TXREG1 ; RCREG1=0x55 ## bailout gas needs + dcfsnz WREG + movff char_I_tank_pres_fill+3, TXREG1 ; RCREG1=0x56 ## bailout gas needs + dcfsnz WREG + movff char_I_tank_pres_fill+4, TXREG1 ; RCREG1=0x57 ## bailout gas needs + dcfsnz WREG + movff char_I_cc_max_frac_o2, TXREG1 ; RCREG1=0x58 ## CCR max ppO2 limiter + dcfsnz WREG + movff opt_sim_setpoint_number, TXREG1 ; RCREG1=0x59 ## deco calculator enhancement + dcfsnz WREG + movff opt_calc_asc_gasvolume, TXREG1 ; RCREG1=0x5A ## bailout gas needs + dcfsnz WREG + movff opt_sim_use_aGF, TXREG1 ; RCREG1=0x5B ## deco calculator enhancement + dcfsnz WREG + movff char_I_altitude_wait, TXREG1 ; RCREG1=0x5C ## no fly altitude + dcfsnz WREG + movff opt_enable_IBCD, TXREG1 ; RCREG1=0x5D ## IBCD + comm_read_abort: comm_read_done: bra comm_download_mode0 ; Done. Loop with timeout reset comm_read_setting_wait: - bra comm_rs232_wait_tx ; Wait for UART (and return!) + bra comm_rs232_wait_tx ; Wait for UART (and return!) comm_read_gas1: movff opt_gas_O2_ratio+0, TXREG1 @@ -1297,9 +1331,9 @@ dcfsnz WREG movff RCREG1, char_I_deco_model ; RCREG1=0x21 dcfsnz WREG - movff RCREG1, opt_ppO2_max ; RCREG1=0x22 + movff RCREG1, char_I_ppO2_max ; RCREG1=0x22 MODIFIED ## V2.94 dcfsnz WREG - movff RCREG1, opt_ppO2_min ; RCREG1=0x23 + movff RCREG1, char_I_ppO2_min ; RCREG1=0x23 MODIFIED ## V2.94 dcfsnz WREG movff RCREG1, char_I_extra_time ; RCREG1=0x24 dcfsnz WREG @@ -1329,7 +1363,7 @@ dcfsnz WREG movff RCREG1, opt_dive_color_scheme ; RCREG1=0x31 dcfsnz WREG - movff RCREG1, opt_language ; RCREG1=0x32 + movff RCREG1, opt_language ; RCREG1=0x32 dcfsnz WREG movff RCREG1, opt_dateformat ; RCREG1=0x33 dcfsnz WREG @@ -1341,7 +1375,7 @@ dcfsnz WREG movff RCREG1, opt_calibration_O2_ratio; RCREG1=0x37 dcfsnz WREG - movff RCREG1, opt_sensor_fallback ; RCREG1=0x38 + nop ; RCREG1=0x38 NOT USED ANYMORE (opt_sensor_fallback) ## voting logic dcfsnz WREG movff RCREG1, opt_flip_screen ; RCREG1=0x39 dcfsnz WREG @@ -1371,19 +1405,55 @@ dcfsnz WREG movff RCREG1, opt_safety_stop_reset ; RCREG1=0x46 dcfsnz WREG - nop ; RCREG1=0x47, ignore conservatism for standard hwOS + nop ; RCREG1=0x47, ignore conservatism for standard hwOS dcfsnz WREG - movff RCREG1, opt_diveTimeout ; RCREG1=0x48 + movff RCREG1, opt_diveTimeout ; RCREG1=0x48 dcfsnz WREG bra comm_write_button_polarity ; RCREG1=0x49 dcfsnz WREG - movff RCREG1, opt_PSCR_drop ; RCREG1=0x4A + movff RCREG1, char_I_PSCR_drop ; RCREG1=0x4A + dcfsnz WREG + movff RCREG1, char_I_PSCR_lungratio ; RCREG1=0x4B dcfsnz WREG - movff RCREG1, opt_PSCR_lungratio ; RCREG1=0x4B + movff RCREG1, char_I_ppO2_max_deco ; RCREG1=0x4C MODIFIED V2.94 + + ; NEW + dcfsnz WREG + movff RCREG1, char_I_ppO2_min_loop ; RCREG1=0x4D ## CCR/pSCR min ppO2 limiter MODIFIED ## V2.94 dcfsnz WREG - movff RCREG1, opt_ppO2_max_deco ; RCREG1=0x4C - - + movff RCREG1, char_I_tank_size+0 ; RCREG1=0x4E ## bailout gas needs + dcfsnz WREG + movff RCREG1, char_I_tank_size+1 ; RCREG1=0x4F ## bailout gas needs + dcfsnz WREG + movff RCREG1, char_I_tank_size+2 ; RCREG1=0x50 ## bailout gas needs + dcfsnz WREG + movff RCREG1, char_I_tank_size+3 ; RCREG1=0x51 ## bailout gas needs + dcfsnz WREG + movff RCREG1, char_I_tank_size+4 ; RCREG1=0x52 ## bailout gas needs + dcfsnz WREG + movff RCREG1, char_I_tank_pres_fill+0 ; RCREG1=0x53 ## bailout gas needs + dcfsnz WREG + movff RCREG1, char_I_tank_pres_fill+1 ; RCREG1=0x54 ## bailout gas needs + dcfsnz WREG + movff RCREG1, char_I_tank_pres_fill+2 ; RCREG1=0x55 ## bailout gas needs + dcfsnz WREG + movff RCREG1, char_I_tank_pres_fill+3 ; RCREG1=0x56 ## bailout gas needs + dcfsnz WREG + movff RCREG1, char_I_tank_pres_fill+4 ; RCREG1=0x57 ## bailout gas needs + dcfsnz WREG + movff RCREG1, char_I_cc_max_frac_o2 ; RCREG1=0x58 ## CCR max ppO2 limiter + dcfsnz WREG + movff RCREG1, opt_sim_setpoint_number ; RCREG1=0x59 ## deco calculator enhancement + dcfsnz WREG + movff RCREG1, opt_calc_asc_gasvolume ; RCREG1=0x5A ## bailout gas needs + dcfsnz WREG + movff RCREG1, opt_sim_use_aGF ; RCREG1=0x5B ## deco calculator enhancement + dcfsnz WREG + movff RCREG1, char_I_altitude_wait ; RCREG1=0x5C ## no fly altitude + dcfsnz WREG + movff RCREG1, opt_enable_IBCD ; RCREG1=0x5D ## TBCD + + comm_write_abort: ; Check Options, gases and diluents call option_check_all ; Check all options (and reset if not within their min/max boundaries) @@ -1393,7 +1463,7 @@ call gaslist_cleanup_list ; Takes care that only one gas can be first and first has 0m change depth call get_first_gas_to_WREG ; Makes sure at least one Gas is "First" call get_first_dil_to_WREG ; Makes sure at least one Diluent is "First" - bra comm_download_mode0 ; Done. Loop with timeout reset + goto comm_download_mode0 ; Done. Loop with timeout reset comm_write_dil1: movff RCREG1,opt_dil_O2_ratio+0 @@ -1403,7 +1473,7 @@ movff RCREG1,opt_dil_type+0 rcall comm_write_get_byte movff RCREG1,char_I_dil_change+0 - bra comm_write_abort ; Done. Loop with timeout reset + bra comm_write_abort ; Done. Loop with timeout reset comm_write_dil2: movff RCREG1,opt_dil_O2_ratio+1 rcall comm_write_get_byte @@ -1412,7 +1482,7 @@ movff RCREG1,opt_dil_type+1 rcall comm_write_get_byte movff RCREG1,char_I_dil_change+1 - bra comm_write_abort ; Done. Loop with timeout reset + bra comm_write_abort ; Done. Loop with timeout reset comm_write_dil3: movff RCREG1,opt_dil_O2_ratio+2 rcall comm_write_get_byte @@ -1421,7 +1491,7 @@ movff RCREG1,opt_dil_type+2 rcall comm_write_get_byte movff RCREG1,char_I_dil_change+2 - bra comm_write_abort ; Done. Loop with timeout reset + bra comm_write_abort ; Done. Loop with timeout reset comm_write_dil4: movff RCREG1,opt_dil_O2_ratio+3 rcall comm_write_get_byte @@ -1430,7 +1500,7 @@ movff RCREG1,opt_dil_type+3 rcall comm_write_get_byte movff RCREG1,char_I_dil_change+3 - bra comm_write_abort ; Done. Loop with timeout reset + bra comm_write_abort ; Done. Loop with timeout reset comm_write_dil5: movff RCREG1,opt_dil_O2_ratio+4 rcall comm_write_get_byte @@ -1439,40 +1509,40 @@ movff RCREG1,opt_dil_type+4 rcall comm_write_get_byte movff RCREG1,char_I_dil_change+4 - bra comm_write_abort ; Done. Loop with timeout reset + bra comm_write_abort ; Done. Loop with timeout reset comm_write_sp1: movff RCREG1,char_I_setpoint_cbar+0 rcall comm_write_get_byte movff RCREG1,char_I_setpoint_change+0 - bra comm_write_abort ; Done. Loop with timeout reset + bra comm_write_abort ; Done. Loop with timeout reset comm_write_sp2: movff RCREG1,char_I_setpoint_cbar+1 rcall comm_write_get_byte movff RCREG1,char_I_setpoint_change+1 - bra comm_write_abort ; Done. Loop with timeout reset + bra comm_write_abort ; Done. Loop with timeout reset comm_write_sp3: movff RCREG1,char_I_setpoint_cbar+2 rcall comm_write_get_byte movff RCREG1,char_I_setpoint_change+2 - bra comm_write_abort ; Done. Loop with timeout reset + bra comm_write_abort ; Done. Loop with timeout reset comm_write_sp4: movff RCREG1,char_I_setpoint_cbar+3 rcall comm_write_get_byte movff RCREG1,char_I_setpoint_change+3 - bra comm_write_abort ; Done. Loop with timeout reset + bra comm_write_abort ; Done. Loop with timeout reset comm_write_sp5: movff RCREG1,char_I_setpoint_cbar+4 rcall comm_write_get_byte movff RCREG1,char_I_setpoint_change+4 - bra comm_write_abort ; Done. Loop with timeout reset + bra comm_write_abort ; Done. Loop with timeout reset ;----------------------------------------------------------------------------- comm_send_string: movlw "n" ; send echo movwf TXREG1 - rcall comm_rs232_wait_tx ; Wait for UART + rcall comm_rs232_wait_tx ; Wait for UART WIN_SMALL comm_string_column, comm_string_row movlw .16 movwf lo ; counter @@ -1516,9 +1586,9 @@ movlw .30 dcfsnz lo,F movlw .31 - cpfsgt day ; day ok? - return ; OK - movlw .1 ; not OK, set to 1st + cpfsgt day ; day ok? + return ; OK + movlw .1 ; not OK, set to 1st movwf day return @@ -1531,7 +1601,7 @@ movff RCREG1,EEDATA movff EEDATA,button_polarity ; 0xFF (Both normal), 0x00 (Both inverted), 0x01 (Left inverted only), 0x02 (Right inverted only) call write_eeprom ; EEDATA into EEPROM@EEADR - clrf EEADRH ; Reset EEADRH + clrf EEADRH ; Reset EEADRH goto comm_download_mode0 ; Done. Loop with timeout reset ;----------------------------------------------------------------------------
--- a/src/compass_ops.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/compass_ops.asm Wed Jan 31 19:39:37 2018 +0100 @@ -217,7 +217,7 @@ banksel common call I2C_init_accelerometer - call I2C_init_compass_fast + call I2C_init_compass btfsc compass_type ; compass1? bra compass_calibration_loop1 ; Yes, skip gain stuff
--- a/src/customview.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/customview.asm Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File customview.asm +; File customview.asm REFACTORED VERSION V2.95 ; ; Customview in Surfacemode and Divemode ; @@ -21,6 +21,7 @@ #include "convert.inc" #include "divemode.inc" #include "i2c.inc" +#include "start.inc" gui CODE @@ -29,46 +30,60 @@ global customview_second customview_second: - movff menupos3,WREG ; copy current view (1-...) + movff menupos3,WREG ; copy current view (1-...) dcfsnz WREG,F - goto TFT_update_ppo2_sensors ; Update Sensor data ; and return + goto TFT_update_ppo2_sensors ; Update Sensor data ; and return dcfsnz WREG,F - goto TFT_update_avr_stopwatch ; Update average depth and stopwatch; and return + goto TFT_update_avr_stopwatch ; Update average depth and stopwatch; and return dcfsnz WREG,F - goto TFT_decoplan ; Show decoplan ; and return + goto TFT_decoplan ; Show decoplan ; and return dcfsnz WREG,F - goto TFT_battinfo_tissues_clock ; Update Battery, Tissues and clock ; and return + goto TFT_battinfo_tissues_clock ; Update Battery, Tissues and clock ; and return dcfsnz WREG,F - goto TFT_gf_info ; Update GF informations ; and return + goto TFT_gf_info ; Update GF informations ; and return dcfsnz WREG,F - return ; Compass updated seperately (Faster) in divemode; + return ; Compass updated separately (faster) in divemode; dcfsnz WREG,F - goto TFT_dyn_gaslist ; Update the gaslist ; and return + nop ; ex goto TFT_dyn_gaslist dcfsnz WREG,F - goto TFT_hud_voltages ; Show HUD details ; and return + goto TFT_CNS ; Show CNS values for end-of-dive, ex goto TFT_hud_voltages dcfsnz WREG,F - bra customview_1sec_view9 ; Make sure to change value in "check_ppo2_display:" when moving around custom views + bra customview_1sec_view9 ; Make sure to change value in "check_ppo2_display:" when moving around custom views dcfsnz WREG,F - goto TFT_sensor_check ; Show ppO2 of O2 and Diluent ; and return + goto TFT_sensor_check ; Show ppO2 of O2 and Diluent ; and return dcfsnz WREG,F - goto TFT_ppo2_ead_end_cns ; Show ppO2, END/EAD and CNS; and return + goto TFT_ppo2_ead_end_cns ; Show ppO2, END/EAD and CNS; and return dcfsnz WREG,F goto TFT_pscr_info ; Show ppO2, drop and lung ratio; and return + dcfsnz WREG,F + goto TFT_gas_needs ; Show gas needs ; Menupos3=0, do nothing return -customview_1sec_view9: ; Ceiling - call TFT_ceiling ; Show Ceiling - ; ppO2 value - call TFT_display_ppo2_val - ; current GF value - extern char_I_deco_model - TSTOSS char_I_deco_model ; 0 = ZH-L16, 1 = ZH-L16-GF - return ; No GF info for non-GF modes - goto TFT_gf_info ; Update GF informations ; and return +customview_1sec_view9: ; Ceiling + call TFT_ceiling ; Show Ceiling + call TFT_display_pure_ppo2 ; ppO2 value + extern char_I_deco_model ; current GF value + TSTOSS char_I_deco_model ; 0 = ZH-L16, 1 = ZH-L16-GF + return ; No GF info for non-GF modes + goto TFT_gf_info ; Update GF informations ; and return + global customview_alternative_second +customview_alternative_second: + movff menupos3,WREG ; copy current view (1-...) + dcfsnz WREG,F + bra customview_alt_second_view1 ; View 1 + dcfsnz WREG,F + nop ; View 2 + ; Menupos3=0, do nothing + return + +customview_alt_second_view1: + bsf FLAG_TFT_max_depth_alt + bsf FLAG_TFT_big_deco_alt + return ;============================================================================= ; Do every-minute tasks for the custom view area @@ -76,7 +91,7 @@ global customview_minute customview_minute: return -; movff menupos3,WREG ; copy +; movff menupos3,WREG ; copy ; dcfsnz WREG,F ; bra customview_1min_view1 ; dcfsnz WREG,F @@ -119,7 +134,7 @@ surf_customview_toggle: bcf switch_right incf menupos3,F ; Number of customview to show - movlw d'9' ; Max number of customsviews in surface mode + movlw d'9' ; Max number of customsviews in surface mode cpfsgt menupos3 ; Max reached? bra surf_customview_mask ; No, show movlw .1 @@ -204,21 +219,21 @@ call TFT_splist_surfmode ; Show Setpoint list bra customview_toggle_exit ; Done. -surf_customview_init_view9: ; View 9: Sensor mV on the surface +surf_customview_init_view9: ; View 9: Sensor mV on the surface btfsc FLAG_ccr_mode bra surf_customview_init_view9a ; we are in CCR mode btfsc FLAG_pscr_mode bra surf_customview_init_view9a ; we are in PSCR mode - bra surf_customview_toggle ; we are not in any rebreather mode, so skip + bra surf_customview_toggle ; we are not in any rebreather mode, so skip surf_customview_init_view9a: - movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP - sublw .1 ; opt_ccr_mode = 1 (Sensor)? - bnz surf_customview_toggle ; sorry, no sensors, skip again + movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP + sublw .1 ; opt_ccr_mode = 1 (Sensor)? + bnz surf_customview_toggle ; sorry, no sensors, skip again STRCPY_TEXT_PRINT tSensorMilliVolt ; Title of customview call TFT_standard_color extern TFT_sensor_mV - call TFT_sensor_mV ; write sensor mV readings to screen - bra customview_toggle_exit ; Done. + call TFT_sensor_mV ; write sensor mV readings to screen + bra customview_toggle_exit ; Done. surf_customview_init_view4: ; View4: Custom text call TFT_standard_color @@ -242,36 +257,49 @@ bra customview_toggle_exit ; Done. surf_customview_init_view7: - btfsc FLAG_gauge_mode ; View7: Deco settings + btfsc FLAG_gauge_mode ; View7: Deco settings bra surf_customview_toggle btfsc FLAG_apnoe_mode bra surf_customview_toggle - extern deco_setup_dive - call deco_setup_dive + call TFT_surface_decosettings ; Show all deco settings bra customview_toggle_exit ; Done. surf_customview_init_view8: ; View8: Last dive info - call TFT_surface_lastdive ; Show last dive interval + call TFT_surface_lastdive ; Show last dive interval bra customview_toggle_exit ; Done. global menuview_toggle -menuview_toggle: ; Show Menu or the simulator tasks +menuview_toggle: ; Show Menu or the simulator tasks + btfss alternative_divelayout ; In alternative layout mode? + bra menuview_toggle2 ; No + ; Switch back to normal mode for any menu tasks + bcf alternative_divelayout ; clear flag + bsf FLAG_TFT_divemode_mask ; Set flag for mask + bsf FLAG_TFT_max_depth ; set flag + btfss decostop_active ; deco? + bsf FLAG_TFT_display_ndl_mask ; NDL + btfsc decostop_active ; deco? + bsf FLAG_TFT_display_deko_mask ; Deco + call TFT_ClearScreen ; Clear screen + rcall customview_mask ; Re-Draw customview + +menuview_toggle2: movlw divemode_menuview_timeout movwf timeout_counter3 bsf menuview - bcf switch_left - incf menupos2,F ; Number of options to show - movlw d'9' ; Max number of options in divemode - cpfsgt menupos2 ; Max reached? - bra menuview_mask ; No, show + bcf switch_left + incf menupos2,F ; Number of options to show + movlw d'10' ; Max number of options in divemode + cpfsgt menupos2 ; Max reached? + bra menuview_mask ; No, show global menuview_toggle_reset -menuview_toggle_reset: ; Timeout occured - clrf menupos2 +menuview_toggle_reset: ; Timeout occurred + clrf menupos2 bcf menuview menuview_mask: - WIN_BOX_BLACK dm_simtext_row, dm_simtext_row+.23, dm_simtext_column, dm_simtext_column+.49 ; top, bottom, left, right + WIN_BOX_BLACK dm_simtext_row, dm_simtext_row+.23, dm_simtext_column, dm_simtext_column+.45 ; top, bottom, left, right - old value was .49 btfss FLAG_gauge_mode bra menuview_mask2 ; Clear some more in gauge mode -- "Reset Avg." text is longer than normal simtext @@ -280,7 +308,7 @@ call TFT_draw_gassep_line movlw color_yellow call TFT_set_color - bsf win_invert ; Set invert flag + bsf win_invert ; Set invert flag WIN_SMALL dm_simtext_column,dm_simtext_row movff menupos2,WREG ; Menupos2 holds number of menu option to show dcfsnz WREG,F @@ -301,9 +329,12 @@ bra menuview_view7 ; "Sim:+5mins" (Sim only) dcfsnz WREG,F bra menuview_view8 ; "Heading" (When compass is shown) + dcfsnz WREG,F + bra menuview_view9 ; "Layout" (Alternative Layout, aka Blind mode) + menuview_exit: call TFT_standard_color - bcf win_invert ; Reset invert flag + bcf win_invert ; Reset invert flag return ; Menupos2 = 0, Show nothing @@ -336,12 +367,12 @@ menuview_view3: btfss simulatormode_active ; View only for simulator mode bra menuview_toggle ; Call next option - STRCPY_PRINT "Sim:-1m" + STRCPY_PRINT "Sim-1m" ; CHANGED, now "-" for going down bra menuview_exit ; Done. menuview_view4: btfss simulatormode_active ; View only for simulator mode bra menuview_toggle ; Call next option - STRCPY_PRINT "Sim:+1m" + STRCPY_PRINT "Sim+1m" ; CHANGED, now "+" for going up bra menuview_exit ; Done. menuview_view5: btfss FLAG_apnoe_mode ; In Apnoe mode? @@ -363,7 +394,7 @@ bra menuview_toggle ; Yes, call next option btfsc FLAG_apnoe_mode ; In Apnoe mode? bra menuview_toggle ; Yes, call next option - STRCPY_PRINT "Sim:+5'" + STRCPY_PRINT "Sim+5'" bra menuview_exit ; Done. menuview_view8: movlw .6 @@ -371,27 +402,81 @@ bra menuview_toggle ; No, call next option STRCPY_TEXT_PRINT tSetHeading ; "Heading" bra menuview_exit ; Done. +menuview_view9: + STRCPY_PRINT "Layout" + bra menuview_exit ; Done. + + ;============================================================================= + +customview_toggle_alternative: + movlw d'1' ; Max number of customviews in divemode, alternative layout + cpfsgt menupos3 ; Max reached? + bra customview_mask_alternative ; No, show + movlw .1 + movwf menupos3 ; Reset to one, always one customview visible in alternative layout +customview_mask_alternative: + ; Clear custom view area in divemode + WIN_BOX_BLACK dm_customview_row, .239, .0, .159 ; top, bottom, left, right + call TFT_standard_color + movff menupos3,WREG ; Menupos3 holds number of customview function + dcfsnz WREG,F + bra customview_alt_init_view1 ; View 1: Big deco/ndl and max. depth + dcfsnz WREG,F + bra customview_alt_init_view2 ; View 2: + + ;bra customview_alternative_toggle_exit ; No view (menupos3=0) + +customview_alt_toggle_exit: + call TFT_standard_color + bcf toggle_customview ; Clear flag + return + +customview_alt_init_view1: ; View 1: Big deco/ndl and max. depth + call TFT_max_depth_alternative + call TFT_big_deco_alt + bra customview_alt_toggle_exit + +customview_alt_init_view2: + ; /* Just for test... + call TFT_mask_avr_stopwatch ; Show mask for average depth and stopwatch + call TFT_update_avr_stopwatch ; Update average depth and stopwatch + ; ...Just for test */ + + bra customview_alt_toggle_exit + + ; Show next customview (and delete this flag) -customview_toggle_reset: ; Timeout occured - clrf menupos3 ; Reset to zero (Zero=no custom view) + global customview_toggle +customview_toggle: + bcf switch_right + incf menupos3,F ; Number of customview to show + + btfsc alternative_divelayout ; In alternative layout mode? + bra customview_toggle_alternative ; Yes, use the big ones instead + + movlw d'13' ; Max number of customviews in divemode + cpfsgt menupos3 ; Max reached? + bra customview_mask ; No, show + clrf menupos3 ; Reset to zero (Zero=no custom view) + global customview_mask customview_mask: ; Clear custom view area in divemode - WIN_BOX_BLACK dm_customview_row, dm_customview_bot, dm_customview_column, dm_customview_rgt ; top, bottom, left, right + WIN_BOX_BLACK dm_customview_row, dm_customview_bot-.2, dm_customview_column, dm_customview_rgt ; top, bottom, left, right WIN_SMALL dm_customview_column,dm_customview_row call TFT_standard_color movff menupos3,WREG ; Menupos3 holds number of customview function dcfsnz WREG,F - bra customview_init_view1 ; Update Sensor data + bra customview_init_view1 ; Update Sensor data dcfsnz WREG,F - bra customview_init_view2 ; average depth and stopwatch + bra customview_init_view2 ; average depth and stopwatch dcfsnz WREG,F - bra customview_init_view3 ; Decoplan + bra customview_init_view3 ; Decoplan dcfsnz WREG,F - bra customview_init_view4 ; Battery info, Tissues and clock + bra customview_init_view4 ; Battery info, Tissues and clock dcfsnz WREG,F bra customview_init_view5 ; GF informations dcfsnz WREG,F @@ -399,7 +484,7 @@ dcfsnz WREG,F bra customview_init_view7 ; Dynamic gaslist dcfsnz WREG,F - bra customview_init_view8 ; HUD voltages + bra customview_init_view8 ; HIJACKED for CNS (ex HUD voltages) dcfsnz WREG,F bra customview_init_view9 ; ppO2, Ceiling and current GF dcfsnz WREG,F @@ -408,17 +493,20 @@ bra customview_init_view11 ; ppO2, END/EAD and CNS dcfsnz WREG,F bra customview_init_view12 ; PSCR Info - + ; NEW ## bailout gas needs + dcfsnz WREG,F + bra customview_init_view13 ; Gas needs + customview_init_nocustomview: call I2C_sleep_accelerometer ; Stop accelerometer call I2C_sleep_compass ; Stop compass - bra customview_toggle_exit + bra customview_toggle_exit customview_init_view1: btfsc FLAG_apnoe_mode ; In Apnoe mode? bra customview_toggle ; yes, Call next view... btfsc FLAG_pscr_mode ; In PSCR mode? - bra customview_init_view1a ; Yes + bra customview_init_view1a ; Yes btfss FLAG_ccr_mode ; In CC mode? bra customview_toggle ; no, Call next view... @@ -432,18 +520,15 @@ btfsc STATUS,Z bra customview_toggle ; no, Call next view... - bsf dive_hud1_displayed ; Set display flag - bsf dive_hud2_displayed ; Set display flag - bsf dive_hud3_displayed ; Set display flag - call TFT_hud_mask ; Setup HUD mask - call TFT_update_ppo2_sensors ; Update Sensor data + call TFT_hud_mask ; Setup HUD mask + call TFT_update_ppo2_sensors ; Update Sensor data bra customview_toggle_exit customview_init_view2: btfsc FLAG_apnoe_mode ; In Apnoe mode? bra customview_toggle ; Yes, Call next view... - call TFT_mask_avr_stopwatch ; Show mask for average depth and stopwatch - call TFT_update_avr_stopwatch ; Update average depth and stopwatch + call TFT_mask_avr_stopwatch ; Show mask for average depth and stopwatch + call TFT_update_avr_stopwatch ; Update average depth and stopwatch bra customview_toggle_exit customview_init_view3: @@ -455,8 +540,8 @@ bra customview_toggle_exit customview_init_view4: - call TFT_battinfo_tissues_clock_mask ; Setup Mask - call TFT_battinfo_tissues_clock ; Show Battery info, Tissues and clock + call TFT_battinfo_tissues_clock_mask ; Setup Mask + call TFT_battinfo_tissues_clock ; Show Battery info, Tissues and clock bra customview_toggle_exit customview_init_view5: @@ -480,172 +565,172 @@ call TFT_dive_compass_mask ; Show compass bra customview_toggle_exit +; MODIFIED - view disabled ## memory customview_init_view7: ; Dynamic gaslist (View 7) - btfsc FLAG_apnoe_mode ; In Apnoe mode? - bra customview_toggle ; Yes, Call next view... - btfsc FLAG_ccr_mode ; In CC mode? +; btfsc FLAG_apnoe_mode ; In Apnoe mode? bra customview_toggle ; Yes, Call next view... - call TFT_dyn_gaslist ; Show the dyn gaslist - bra customview_toggle_exit +; btfsc FLAG_ccr_mode ; In CC mode? +; bra customview_toggle ; Yes, Call next view... +; call TFT_dyn_gaslist ; Show the dyn gaslist +; bra customview_toggle_exit -customview_init_view8: ; Sensor millivolts +customview_init_view8: ; HIJACKED for CNS outputs (ex Sensor millivolts) btfsc FLAG_gauge_mode ; In Gauge mode? bra customview_toggle ; Yes, Call next view... btfsc FLAG_apnoe_mode ; In Apnoe mode? bra customview_toggle ; yes, Call next view... - btfsc FLAG_pscr_mode ; In PSCR mode? - bra customview_init_view8a ; Yes - btfss FLAG_ccr_mode ; In CC mode? - bra customview_toggle ; no, Call next view... -customview_init_view8a: - movf hardware_flag,W - sublw 0x13 ; + - btfsc STATUS,Z - bra customview_toggle ; no, Call next view... + ; REPLACE ## CNS at end-of-dive + ; btfsc FLAG_pscr_mode ; In PSCR mode? + ; bra customview_init_view8a ; Yes + ; btfss FLAG_ccr_mode ; In CC mode? + ; bra customview_toggle ; no, Call next view... +; customview_init_view8a: + ; movf hardware_flag,W + ; sublw 0x13 ; + + ; btfsc STATUS,Z + ; bra customview_toggle ; no, Call next view... + ; movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP + ; sublw .1 ; opt_ccr_mode = 1 (Sensor)? + ; bnz customview_toggle ; no, Call next view... + ; call TFT_hud_mask ; Setup HUD mask + ; call TFT_hud_voltages ; Show HUD details + ; BY + call TFT_CNS_mask + call TFT_CNS - movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP - sublw .1 ; opt_ccr_mode = 1 (Sensor)? - bnz customview_toggle ; no, Call next view... - call TFT_hud_mask ; Setup HUD mask - call TFT_hud_voltages ; Show HUD details - goto customview_toggle_exit + goto customview_toggle_exit customview_init_view9: ; ppO2, Ceiling and current GF btfsc FLAG_apnoe_mode ; In Apnoe mode? - bra customview_toggle ; yes, Call next view... + bra customview_toggle ; yes, Call next view... btfsc FLAG_gauge_mode ; In Gauge mode? - bra customview_toggle ; Yes, Call next view... + bra customview_toggle ; Yes, Call next view... call TFT_ceiling_mask ; Setup mask call TFT_ceiling ; Show Ceiling ; ppO2 value call TFT_mask_ppo2 - call TFT_display_ppo2_val + call TFT_display_pure_ppo2 ; current GF value extern char_I_deco_model TSTOSS char_I_deco_model ; 0 = ZH-L16, 1 = ZH-L16-GF - bra customview_toggle_exit ; No GF info for non-GF modes + bra customview_toggle_exit ; No GF info for non-GF modes ; current GF value call TFT_gf_mask_cGF ; Setup Mask - current GF only call TFT_gf_info ; Show GF informations bra customview_toggle_exit - -;============================================================================= -; Show next customview (and delete this flag) - global customview_toggle -customview_toggle: - bcf switch_right - incf menupos3,F ; Number of customview to show - movlw d'12' ; Max number of customsviews in divemode - cpfsgt menupos3 ; Max reached? - goto customview_mask ; No, show - goto customview_toggle_reset - - customview_init_view10: ; Sensor check - btfsc FLAG_apnoe_mode ; In Apnoe mode? - bra customview_toggle ; yes, Call next view... - btfsc FLAG_gauge_mode ; In Gauge mode? - bra customview_toggle ; Yes, Call next view... - btfss FLAG_ccr_mode ; In CC mode? - bra customview_toggle ; no, Call next view... + btfsc FLAG_apnoe_mode ; In Apnoe mode? + bra customview_toggle ; yes, Call next view... + btfsc FLAG_gauge_mode ; In Gauge mode? + bra customview_toggle ; Yes, Call next view... + btfss FLAG_ccr_mode ; In CC mode? + bra customview_toggle ; no, Call next view... call TFT_sensor_check_mask ; Show ppO2 of O2 and Diluent mask call TFT_sensor_check ; Show ppO2 of O2 and Diluent bra customview_toggle_exit customview_init_view11: ; ppO2, END/EAD and CNS - btfsc FLAG_apnoe_mode ; In Apnoe mode? - bra customview_toggle ; yes, Call next view... - btfsc FLAG_gauge_mode ; In Gauge mode? - bra customview_toggle ; Yes, Call next view... + btfsc FLAG_apnoe_mode ; In Apnoe mode? + bra customview_toggle ; yes, Call next view... + btfsc FLAG_gauge_mode ; In Gauge mode? + bra customview_toggle ; Yes, Call next view... call TFT_ppo2_ead_end_cns_mask ; Show ppO2, END/EAD and CNS mask call TFT_ppo2_ead_end_cns ; Show ppO2, END/EAD and CNS goto customview_toggle_exit -customview_init_view12: ; PSCR Info - btfss FLAG_pscr_mode ; In PSCR mode? - bra customview_toggle ; No, Call next view... +customview_init_view12: ; PSCR Info + btfss FLAG_pscr_mode ; In PSCR mode? + bra customview_toggle ; No, Call next view... - call TFT_pscr_info_mask ; Show ppO2, drop and lung ratio - call TFT_pscr_info ; Show ppO2, drop and lung ratio + call TFT_pscr_info_mask ; Show ppO2, drop and lung ratio + call TFT_pscr_info ; Show ppO2, drop and lung ratio bra customview_toggle_exit - + +; NEW ## bailout gas needs +customview_init_view13: ; Gas Needs + TSTOSS opt_calc_asc_gasvolume ; check if gas volume calculations is switched on + bra customview_toggle ; NO - Call next view... + call TFT_gas_needs_mask ; YES - Show the mask for gas needs + call TFT_gas_needs ; Show the gas needs + bra customview_toggle_exit + customview_toggle_exit: - btfsc divemode ; In Dive Mode? - call TFT_temp_divemode ; Yes, redraw temperature - call TFT_standard_color - bcf toggle_customview ; Clear flag - return + btfsc divemode ; In Dive Mode? + bsf FLAG_TFT_temp_divemode ; Set flag to redraw temp + call TFT_standard_color + bcf toggle_customview ; Clear flag + return global customview_show_change_depth -customview_show_change_depth: ; Put " lom" or " loft" into Postinc2 +customview_show_change_depth: ; Put " lom" or " loft" into Postinc2 PUTC " " - TSTOSS opt_units ; 0=m, 1=ft + TSTOSS opt_units ; 0=m, 1=ft bra customview_show_mix_metric movf lo,W - mullw .100 ; convert meters to mbar + mullw .100 ; convert meters to mbar movff PRODL,lo movff PRODH,hi - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet bsf leftbind - output_16 ; Change depth in lo:hi + output_16 ; Change depth in lo:hi bcf leftbind STRCAT_TEXT tFeets return customview_show_mix_metric: - output_99 ; Change depth in lo + output_99 ; Change depth in lo STRCAT_TEXT tMeters return global customview_show_mix -customview_show_mix: ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 - tstfsz hi ; He=0? - bra customview_show_mix5 ; No, Show a TX +customview_show_mix: ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 + tstfsz hi ; He=0? + bra customview_show_mix5 ; No, Show a TX movlw .21 cpfseq lo ; Air? - bra customview_show_mix2 ; No + bra customview_show_mix2 ; No STRCAT_TEXT tSelectAir ; Yes, show "Air" bra customview_show_mix4b customview_show_mix2: movlw .100 cpfseq lo ; O2? - bra customview_show_mix3 ; No + bra customview_show_mix3 ; No STRCAT_TEXT tSelectO2 ; Yes, show "O2" bra customview_show_mix4b customview_show_mix3: movlw .21 cpfslt lo ; < Nx21? - bra customview_show_mix4 ; No - STRCAT_TEXT tGasErr ; Yes, show "Err" - output_99 ; O2 ratio is still in "lo" + bra customview_show_mix4 ; No + STRCAT_TEXT tGasErr ; Yes, show "Err" + output_99 ; O2 ratio is still in "lo" bra customview_show_mix4c customview_show_mix4: - STRCAT_TEXT tSelectNx ; Show "Nx" - output_99 ; O2 ratio is still in "lo" + STRCAT_TEXT tSelectNx ; Show "Nx" + output_99 ; O2 ratio is still in "lo" customview_show_mix4b: STRCAT " " customview_show_mix4c: - btfsc divemode ; In divemode - return ; Yes + btfsc divemode ; In divemode + return ; Yes STRCAT " " return customview_show_mix5: btfsc divemode bra customview_show_mix6 - STRCAT_TEXT tSelectTx ; Show "Tx" + STRCAT_TEXT tSelectTx ; Show "Tx" customview_show_mix6: - output_99 ; O2 ratio is still in "lo" + output_99 ; O2 ratio is still in "lo" PUTC "/" movff hi,lo - output_99 ; He ratio + output_99 ; He ratio return END \ No newline at end of file
--- a/src/customview.inc Wed Dec 27 14:34:11 2017 +0100 +++ b/src/customview.inc Wed Jan 31 19:39:37 2018 +0100 @@ -18,6 +18,8 @@ extern menuview_toggle extern menuview_toggle_reset extern customview_mask + + extern customview_alternative_second ; Surface mode extern surf_customview_toggle
--- a/src/divemenu_tree.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/divemenu_tree.asm Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File divemenu_tree.asm +; File divemenu_tree.asm REFACTORED VERSION V2.96a ; ; OSTC dive mode menu ; @@ -17,302 +17,333 @@ #include "strings.inc" #include "calibrate.inc" + divegui CODE ;============================================================================= ; Main Menu - global do_main_divemenu + global do_main_divemenu do_main_divemenu: - call menu_processor_reset ; restart from first icon. + call menu_processor_reset ; restart from first icon. do_continue_main_divemenu: - call menu_processor_pop ; drop exit line. - call menu_processor_pop ; drop exit line. + call menu_processor_pop ; drop exit line. + call menu_processor_pop ; drop exit line. - btfsc FLAG_ccr_mode - bra main_divemenu_ccr ; CCR Menu - - btfsc FLAG_pscr_mode - bra main_divemenu_ccr ; Proceeds to PSCR menu then... + btfsc FLAG_ccr_mode + bra main_divemenu_loop ; goto CCR / pSCR Menu menu + btfsc FLAG_pscr_mode + bra main_divemenu_loop ; goto CCR / pSCR Menu menu + +main_divemenu_OC: + bcf ccr_diluent_setup + bcf is_bailout_menu + movlw .1 + movwf menupos ; Set to first option in divemode menu - bcf ccr_diluent_setup ; For OC gases - bcf is_bailout_menu - movlw .1 - movwf menupos ; Set to first option in divemode menu - MENU_BEGIN tMainMenu, .5 - MENU_CALL tDivemenu_Gaslist, do_divemode_gaslist - MENU_CALL tDivemenu_ResetAvg, do_divemode_resetavg - MENU_CALL tDivemenu_ToggleGF, do_divemode_togglegf - MENU_CALL tDivemenu_Marker, do_set_marker - MENU_CALL tExit, do_exit_divemode_menu - MENU_END + MENU_BEGIN tMainMenu, .5 + MENU_CALL tDivemenu_Gaslist, do_divemode_gaslist + MENU_CALL tDivemenu_ResetAvg, do_reset_average + MENU_CALL tDivemenu_ToggleGF, do_toggle_gf + MENU_CALL tDivemenu_Marker, do_set_marker + MENU_CALL tExit, do_exit_divemode_menu + MENU_END -do_set_marker: - movlw d'6' ; Type of Alarm (Manual Marker) - movwf AlarmType ; Copy to Alarm Register - bsf event_occured ; Set Event Flag - bra do_exit_divemode_menu ; And exit - -main_divemenu_ccr: - bsf ccr_diluent_setup ; For diluents +main_divemenu_loop: + bsf ccr_diluent_setup ; default to operations on diluents + bcf is_bailout_menu ; default to none-bailout menu movlw .1 - movwf menupos ; Set to first option in divemode menu + movwf menupos ; Set to first option in divemode menu btfsc FLAG_pscr_mode - bra main_divemenu_pscr ; PSCR Menu + bra main_divemenu_pscr ; PSCR Menu MENU_BEGIN tMainMenu, .6 MENU_CALL tDiveBailout, do_divemode_gaslist_bail MENU_CALL tDivemenu_Setpoint, do_divemode_splist MENU_CALL tDivemenu_Gaslist, do_divemode_gaslist - MENU_CALL tDivemenu_ResetAvg, do_divemode_resetavg - MENU_CALL tDivemenu_ToggleGF, do_divemode_togglegf + MENU_CALL tDivemenu_ResetAvg, do_reset_average + MENU_CALL tDivemenu_ToggleGF, do_toggle_gf MENU_CALL tExit, do_exit_divemode_menu MENU_END main_divemenu_pscr: + movf hardware_flag,W + sublw 0x11 ; 2 with BLE + btfsc STATUS,Z + bra main_divemenu_pscr_no_sensors + movf hardware_flag,W + sublw 0x13 ; + + btfsc STATUS,Z + bra main_divemenu_pscr_no_sensors + MENU_BEGIN tMainMenu, .6 MENU_CALL tDiveBailout, do_divemode_gaslist_bail - MENU_CALL tDivemenu_Gaslist, do_divemode_gaslist_pscr ; quit bailout and always use diluents here - MENU_CALL tDivemenu_ResetAvg, do_divemode_resetavg - MENU_CALL tDivemenu_ToggleGF, do_divemode_togglegf - MENU_CALL tDivemenu_Marker, do_set_marker + MENU_CALL tCCRSensor, do_divemode_setpoint_pscr + MENU_CALL tDivemenu_Gaslist, do_divemode_gaslist + MENU_CALL tDivemenu_ResetAvg, do_reset_average + MENU_CALL tDivemenu_ToggleGF, do_toggle_gf + MENU_CALL tExit, do_exit_divemode_menu + MENU_END + +main_divemenu_pscr_no_sensors: + MENU_BEGIN tMainMenu, .6 + MENU_CALL tDiveBailout, do_divemode_gaslist_bail + MENU_CALL tDivemenu_Gaslist, do_divemode_gaslist + MENU_CALL tDivemenu_ResetAvg, do_reset_average + MENU_CALL tDivemenu_ToggleGF, do_toggle_gf + MENU_CALL tDivemenu_Marker, do_set_marker MENU_CALL tExit, do_exit_divemode_menu MENU_END - -do_togglegf: - TSTOSS opt_enable_aGF ; =1: aGF can be selected underwater - bra do_exit_divemode_menu ; exit - bsf toggle_gf ; Set flag... - bra do_exit_divemode_menu ; ...and exit + -do_switch_to_sensor: - movlw .1 ; Switch to Sensor - movff WREG,opt_ccr_mode ; =0: Fixed SP, =1: Sensor, =2: Auto SP - bsf voting_logic_sensor1 - bsf voting_logic_sensor2 - bsf voting_logic_sensor3 - extern divemode_setup_sensor_values - call divemode_setup_sensor_values ; Setup sensor values - call check_sensors ; Check O2 sensor thresholds for fallback - bra do_switch_sp2 - -do_divemode_resetavg: - bsf reset_average_depth ; Set Flag - bra do_exit_divemode_menu ; And exit +do_toggle_gf: + movff char_I_deco_model,WREG ; 0 = ZH-L16, 1 = ZH-L16-GF + decfsz WREG,W ; Toggle GF only in GF modes - in GF mode? + bra do_continue_main_divemenu ; No, do nothing and return + TSTOSS opt_enable_aGF ; =1: aGF can be selected underwater + bra do_continue_main_divemenu ; No, do nothing and return + movlw .4 ; Set customview to 5 (GF informations) + movwf menupos3 ; Customview to come-1 + bsf toggle_customview ; Set flag, the customview will be toggled very soon now... + movlw .1 + movwf menupos ; Set to first option in divemode menu + + MENU_BEGIN tDivemenu_ToggleGF, .2 + MENU_CALL tDivemenu_ToggleGF, do_togglegf + MENU_CALL tExit, do_continue_main_divemenu + MENU_END +do_togglegf: + ;TSTOSS opt_enable_aGF ; =1: aGF can be selected underwater ## check is now done before entering menu + ;bra do_exit_divemode_menu ; continue with exiting menu code + bsf toggle_gf ; Set flag... + bra do_exit_divemode_menu ; continue with exiting menu code + + +do_set_marker: + movlw d'6' ; Type of Alarm (Manual Marker) + movwf AlarmType ; Copy to Alarm Register + bsf event_occured ; Set Event Flag + bra do_exit_divemode_menu ; And exit -do_switch_gas6: - movlw .6 - movwf active_gas ; Gas6 selected - movff WREG,char_I_current_gas ; for p2_deco.c - bra do_switch_gasX - extern diveloop_loop4 - extern timeout_divemode_menu2 -do_switch_gas: - bsf divemode_gaschange ; Set flag -do_switch_gasX: - btfsc is_bailout_menu ; Bailout confirmed? - bsf is_bailout ; =1: Bailout - call customview_mask ; update customview mask to (eventually) rewrite ppO2(Dil): to ppO2: -do_exit_divemode_menu: - call timeout_divemode_menu2 - clrf STKPTR - goto diveloop_loop4 + +do_reset_average: + bsf reset_average_depth ; Set Flag + bra do_exit_divemode_menu ; continue with exiting menu code -do_switch_sp: - decf menupos,W ; 1-5 -> 0-4 + +do_switch_sensor: ; entry point when coming from switch to sensor + movlw .1 ; Switch to Sensor + movff WREG,opt_ccr_mode ; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP + bra do_switch_sp_com ; continue with common part + +do_switch_sp: ; entry point when coming from manual setpoint selection (CCR) + decf menupos,W ; 1-5 -> 0-4 lfsr FSR1,char_I_setpoint_cbar - movff PLUSW1,char_I_const_ppO2; Setup fixed Setpoint + movff PLUSW1,char_I_const_ppO2 ; setup fixed setpoint movff char_I_const_ppO2,WREG - call transmit_setpoint ; Transmit current setpoint from WREG (in cbar) to external electronics - bsf setpoint_changed ; Set flag (For profile) - bsf event_occured ; Set global event byte + call transmit_setpoint ; tansmit current setpoint from WREG (in cbar) to external electronics + bcf setpoint_fallback ; clear fallback condition (stops fallback warning) + clrf WREG ; Switch to fixed SP + movff WREG,opt_ccr_mode ; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP + bra do_switch_sp_com - ; Reconfigure last diluent - extern setup_dil_registers - bcf is_bailout ; =1: Bailout - movff active_diluent,WREG ; As a backup when switching back from Bailout to CCR - decf WREG ; 0-4 - call setup_dil_registers ; With WREG=Gas 0-4 +do_switch_sp_calc: ; entry point when coming from switch to calculated ppO2 (pSCR) + bcf setpoint_fallback ; clear fallback condition (stops fallback warning) + clrf WREG ; Switch to fixed SP + movff WREG,opt_ccr_mode ; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP + movff WREG,char_I_const_ppO2 ; set setpoint to 0, this forces deco engine to take the computed ppO2 - clrf WREG ; Switch to fixed SP - movff WREG,opt_ccr_mode ; =0: Fixed SP, =1: Sensor, =2: Auto SP - clrf WREG - movff WREG,char_O_deco_status ; Restart decoplan computation +do_switch_sp_com: ; merge point to common part + bsf event_occured ; set global event byte + bsf setpoint_changed ; set flag (for profile) -do_switch_sp2: ; Clear some flags in case we were in bailout before... - bcf is_bailout ; =1: Bailout - bcf is_bailout_menu ; - bcf better_gas_available ;=1: A better gas is available and a gas change is advised in divemode - bcf blinking_better_gas ; Clear blinking flag - call customview_mask ; update customview mask to (eventually) rewrite ppO2(Dil): to ppO2: - bra do_exit_divemode_menu ; And exit + bcf is_bailout ; end bailout mode + ;bcf is_bailout_menu ; not needed + bcf better_gas_available ; =1: A better gas is available and a gas change is advised in divemode + bcf blinking_better_gas ; clear blinking flag + call customview_mask ; update customview mask to (eventually) rewrite ppO2(Dil): to ppO2: + + movff active_diluent,menupos ; reconfigure last diluent (menupos is transfer register for selected gas/diluent towards gas_switched_common:) + bsf divemode_gaschange ; initiate reconfiguration to loop mode on last diluent + + bra do_exit_divemode_menu ; continue with exiting menu code -do_divemode_gaslist_pscr: - bsf ccr_diluent_setup ; For Diluents - bcf is_bailout ; =1: Bailout - bcf is_bailout_menu ; - bra do_divemode_gaslist_pscr2 - -do_divemode_gaslist_bail: - bcf ccr_diluent_setup ; For OC gases - bsf is_bailout_menu ; =1: Bailout -do_divemode_gaslist: - btfsc is_bailout ; In Bailout case? - bcf ccr_diluent_setup ; Yes, use OC gases -do_divemode_gaslist_pscr2: - bsf short_gas_decriptions - movlw .1 - movwf menupos ; Set to first option in divemode menu + +do_divemode_gaslist_bail: ; entry point from CCR/pSCR to bailout to OC gases + bcf ccr_diluent_setup ; switch to OC gases + bsf is_bailout_menu ; flag it is a bailout action +do_divemode_gaslist: ; entry point for switching: OC -> gases, loop -> diluents + btfsc is_bailout ; in bailout mode? + bcf ccr_diluent_setup ; yes - for safety reasons, redirect to OC (bailout) gases +do_divemode_gaslist_com: + bsf short_gas_decriptions + movlw .1 + movwf menupos ; Set to first option in divemode menu MENU_BEGIN tGaslist, .6 MENU_DYNAMIC gaslist_strcat_gas_mod, do_switch_gas MENU_DYNAMIC gaslist_strcat_gas_mod, do_switch_gas MENU_DYNAMIC gaslist_strcat_gas_mod, do_switch_gas MENU_DYNAMIC gaslist_strcat_gas_mod, do_switch_gas MENU_DYNAMIC gaslist_strcat_gas_mod, do_switch_gas - MENU_CALL tMore, do_divemode_gaslist_more0 + MENU_CALL tMore, do_divemode_gaslist_more MENU_END -do_divemode_gaslist_more0: - movlw .1 - movwf menupos ; Set to first option in divemode menu do_divemode_gaslist_more: + movlw .1 + movwf menupos ; Set to first option in divemode menu + + movff char_I_O2_ratio,gas6_O2_ratio ; initialize gas6 with currently breathed gas - O2 ratio + movff char_I_He_ratio,gas6_He_ratio ; initialize gas6 with currently breathed gas - He ratio + +do_divemode_gaslist_more_loop: MENU_BEGIN tGaslist, .6 MENU_CALL tO2Plus, do_dive_pO2 MENU_CALL tO2Minus, do_dive_mO2 MENU_CALL tHePlus, do_dive_pHe MENU_CALL tHeMinus, do_dive_mHe - MENU_DYNAMIC gaslist_strcat_gasx, do_switch_gas6 + MENU_DYNAMIC gaslist_strcat_gas6, do_switch_gas6 MENU_CALL tDivemenu_LostGas, do_lost_gas MENU_END do_lost_gas: - movlw .1 - movwf menupos ; Set to first option in divemode menu -do_lost_gas0: - bsf short_gas_decriptions + movlw .1 + movwf menupos ; Set to first option in divemode menu +do_lost_gas_loop: + bsf short_gas_decriptions MENU_BEGIN tDivemenu_LostGas, .6 MENU_DYNAMIC gaslist_strcat_gas_mod, do_toggle_active ; Toggle the gas (in)active MENU_DYNAMIC gaslist_strcat_gas_mod, do_toggle_active ; Toggle the gas (in)active MENU_DYNAMIC gaslist_strcat_gas_mod, do_toggle_active ; Toggle the gas (in)active MENU_DYNAMIC gaslist_strcat_gas_mod, do_toggle_active ; Toggle the gas (in)active MENU_DYNAMIC gaslist_strcat_gas_mod, do_toggle_active ; Toggle the gas (in)active - MENU_CALL tExit, do_exit_divemode_menu + MENU_CALL tExit, do_exit_divemode_menu MENU_END + +do_switch_gas6: + movlw .6 ; gas 6 + movwf menupos ; transfer register for selected gas towards gas_switched_common: + bsf gas6_changed ; set flag for profile recording + ;bra do_switch_gas ; continue with common gas-switched code + +do_switch_gas: + bsf divemode_gaschange ; Set flag, will also trigger restart of deco_engine + btfsc is_bailout_menu ; Bailout confirmed? + bsf is_bailout ; begin bailout mode + call customview_mask ; update custom view mask to (eventually) rewrite ppO2(Dil): to ppO2: + ;bra do_exit_divemode_menu ; continue with exiting menu code + +do_exit_divemode_menu: + extern timeout_divemode_menu2 + call timeout_divemode_menu2 + clrf STKPTR + extern diveloop_loop4 + goto diveloop_loop4 + + do_toggle_active: + extern restart_deco_engine_wo_ceiling + call restart_deco_engine_wo_ceiling movlw .5 - btfsc ccr_diluent_setup ; use OC gases - addwf menupos,F ; -> 6-10 for Diluents - - decf menupos,W ; 1-5 -> 0-4 + btfsc ccr_diluent_setup ; diluents? + addwf menupos,F ; yes 1-5 -> 6-10 + decf menupos,W ; -> 0-4 for gases / 5-9 for diluents lfsr FSR1,opt_gas_type+0 movff PLUSW1,lo - tstfsz lo ; Already disabled? - bra do_toggle_active2 ; No, disable now! - - ; Copy opt_gas_type_backup+W back to opt_gas_type+W - decf menupos,W ; 1-5 -> 0-4 - lfsr FSR1,opt_gas_type_backup+0 + tstfsz lo ; Already disabled? + bra do_toggle_active2 ; No, disable now! + lfsr FSR1,opt_gas_type_backup+0 ; copy opt_gas_type_backup+W back to opt_gas_type+W movff PLUSW1,lo - decf menupos,W ; 1-5 -> 0-4 lfsr FSR1,opt_gas_type+0 movff lo,PLUSW1 - - ; Copy opt_OC_bail_gas_change_backup+W back to opt_OC_bail_gas_change+W - decf menupos,W ; 1-5 -> 0-4 - lfsr FSR1,opt_OC_bail_gas_change_backup+0 + lfsr FSR1,opt_OC_bail_gas_change_backup+0 ; copy opt_OC_bail_gas_change_backup+W back to opt_OC_bail_gas_change+W movff PLUSW1,lo - decf menupos,W ; 1-5 -> 0-4 - lfsr FSR1,opt_OC_bail_gas_change+0 + lfsr FSR1,opt_OC_bail_gas_change+0 movff lo,PLUSW1 - + bra do_toggle_active3 +do_toggle_active2: + clrf PLUSW1 ; 0=Disabled, 1=First, 2=Travel, 3=Deco + lfsr FSR1,opt_OC_bail_gas_change+0 + clrf PLUSW1 ; also delete change depth here to have the menu updated immediately +do_toggle_active3: movlw .5 - btfsc ccr_diluent_setup ; use OC gases? - subwf menupos,F ; Back to 1-5 + btfsc ccr_diluent_setup ; use OC gases? + subwf menupos,F ; Back to 1-5 + bra do_lost_gas_loop ; Return to list and show updated result - bra do_lost_gas0 ; Return to list and show updated result - -do_toggle_active2: - clrf PLUSW1 ; 0=Disabled, 1=First, 2=Travel, 3=Deco - - ; Also delete change depth here to have the menu updated immediately - lfsr FSR1,opt_OC_bail_gas_change+0 - clrf PLUSW1 - - movlw .5 - btfsc ccr_diluent_setup ; use OC gases? - subwf menupos,F ; Back to 1-5 - - bra do_lost_gas0 ; Return to list and show updated result do_dive_pO2: - banksel char_I_O2_ratio - incf char_I_O2_ratio,F ; O2++ - movf char_I_He_ratio,W - addwf char_I_O2_ratio,W - movwf temp_bankx400 - movlw .101 - cpfslt temp_bankx400 ; O2+He<101? - decf char_I_O2_ratio,F ; O2-- (Unchanged) -; bra do_divemode_gaslist_more_common -do_divemode_gaslist_more_common: - movf char_I_O2_ratio,W ; Add O2... - addwf char_I_He_ratio,W ; ...and He... - sublw .100 ; ...subtract both from 100 - movwf char_I_N2_ratio ; -> N2! - banksel common - bsf gas6_changed ; Set flag - bra do_divemode_gaslist_more - + banksel gas6_O2_ratio + incf gas6_O2_ratio,F ; O2++ + movf gas6_He_ratio,W + addwf gas6_O2_ratio,W + movwf gas6_temp + movlw .101 + cpfslt gas6_temp ; O2+He<101? + decf gas6_O2_ratio,F ; O2-- (Unchanged) + banksel common + bra do_divemode_gaslist_more_loop + do_dive_mO2: - banksel char_I_O2_ratio - decf char_I_O2_ratio,F ; O2-- - movlw gaslist_min_o2 - cpfslt char_I_O2_ratio - bra do_divemode_gaslist_more_common - movlw gaslist_min_o2 - movwf char_I_O2_ratio - bra do_divemode_gaslist_more_common - + banksel gas6_O2_ratio + decf gas6_O2_ratio,F ; O2-- + movlw gaslist_min_o2 + cpfslt gas6_O2_ratio + bra do_dive_mO2_done + movlw gaslist_min_o2 + movwf gas6_O2_ratio +do_dive_mO2_done: + banksel common + bra do_divemode_gaslist_more_loop do_dive_pHe: - banksel char_I_O2_ratio - incf char_I_He_ratio,F ; He++ - movf char_I_He_ratio,W - addwf char_I_O2_ratio,W - movwf lo - movlw .101 - cpfslt lo ; O2+He<101? - decf char_I_He_ratio,F ; Yes, He-- (Unchanged) - bra do_divemode_gaslist_more_common + banksel gas6_O2_ratio + incf gas6_He_ratio,F ; He++ + movf gas6_He_ratio,W + addwf gas6_O2_ratio,W + movwf lo + movlw .101 + cpfslt lo ; O2+He<101? + decf gas6_He_ratio,F ; Yes, He-- (Unchanged) + banksel common + bra do_divemode_gaslist_more_loop do_dive_mHe: - banksel char_I_O2_ratio - decf char_I_He_ratio,F ; He-- - bnn do_divemode_gaslist_more_common - clrf char_I_He_ratio - bra do_divemode_gaslist_more_common + banksel gas6_O2_ratio + decf gas6_He_ratio,F ; He-- + bnn do_dive_mHe_done + clrf gas6_He_ratio +do_dive_mHe_done: + banksel common + bra do_divemode_gaslist_more_loop do_divemode_splist: - bsf short_gas_decriptions - movlw .1 - movwf menupos ; Set to first option in divemode menu - movf hardware_flag,W - sublw 0x11 ; 2 with BLE - btfsc STATUS,Z - bra do_divemode_splist2 + bsf short_gas_decriptions + movlw .1 + movwf menupos ; Set to first option in divemode menu + + movf hardware_flag,W + sublw 0x11 ; 2 with BLE + btfsc STATUS,Z + bra do_divemode_splist_no_sensor ; no sensor + movf hardware_flag,W + sublw 0x13 ; + + btfsc STATUS,Z + bra do_divemode_splist_no_sensor ; no sensor + +do_divemode_splist_with_sensor: MENU_BEGIN tGaslist, .6 MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp - MENU_CALL tCCRSensor, do_divemode_sensor + MENU_CALL tCCRSensor, do_divemode_sensor MENU_END -do_divemode_splist2: +do_divemode_splist_no_sensor: MENU_BEGIN tGaslist, .5 MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp @@ -323,31 +354,45 @@ do_divemode_sensor: - ; Set customview to 1 (HUD Data) - clrf menupos3 ; customview to come-1 - bsf toggle_customview ; Set flag, the customview will be toggled very soon now... + clrf menupos3 ; show customview 1 (HUD Data) + bsf toggle_customview movlw .1 - movwf menupos ; Set to first option in divemode menu - MENU_BEGIN tGaslist, .2 - MENU_CALL tDivemenu_UseSensor, do_switch_to_sensor + movwf menupos ; Set to 1st option: use sensors +do_divemode_sensor_loop: + MENU_BEGIN tGaslist, .6 + MENU_CALL tDivemenu_UseSensor, do_switch_sensor + MENU_CALL tBack, do_divemode_splist MENU_CALL tExit, do_continue_main_divemenu + MENU_CALL tDiveHudMask1, do_toggle_sensor + MENU_CALL tDiveHudMask2, do_toggle_sensor + MENU_CALL tDiveHudMask3, do_toggle_sensor MENU_END -do_divemode_togglegf: - movff char_I_deco_model,WREG ; 0 = ZH-L16, 1 = ZH-L16-GF - decfsz WREG,W ; Was 1? - bra do_continue_main_divemenu ; No, do nothing and return - - ; Toggle GF only in GF modes - ; Set customview to 5 (GF informations) - movlw .4 - movwf menupos3 ; Customview to come-1 - bsf toggle_customview ; Set flag, the customview will be toggled very soon now... +do_divemode_setpoint_pscr: movlw .1 - movwf menupos ; Set to first option in divemode menu - MENU_BEGIN tDivemenu_ToggleGF, .2 - MENU_CALL tDivemenu_ToggleGF, do_togglegf + movwf menupos ; Set to 1st option: use calculated ppO2 + MENU_BEGIN tGaslist, .6 + MENU_CALL tCalculated, do_switch_sp_calc + MENU_CALL tDivemenu_UseSensor, do_switch_sensor MENU_CALL tExit, do_continue_main_divemenu + MENU_CALL tDiveHudMask1, do_toggle_sensor + MENU_CALL tDiveHudMask2, do_toggle_sensor + MENU_CALL tDiveHudMask3, do_toggle_sensor MENU_END +do_toggle_sensor: + decf menupos,f ; 4, 5, 6 -> 3, 4, 5 + decf menupos,f ; 3, 4, 5 -> 2, 3, 4 + decf menupos,f ; 2, 3, 4 -> 1, 2, 3 + dcfsnz menupos ; 1, 2, 3 -> 0, 1, 2 + btg use_O2_sensor1 ; = + dcfsnz menupos ; 0, 1, 2 -> -1, 0, 1 + btg use_O2_sensor2 ; = + dcfsnz menupos ; -1,0, 1 -> -2,-1, 0 + btg use_O2_sensor3 ; = + movlw .1 + movwf menupos + bra do_divemode_sensor_loop + + END \ No newline at end of file
--- a/src/divemode.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/divemode.asm Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File divemode.asm +; File divemode.asm REFACTORED VERSION V2.96a ; ; Divemode ; @@ -9,19 +9,19 @@ ; HISTORY ; 2011-08-15 : [mH] moving from OSTC code -#include "hwos.inc" ; Mandatory header -#include "shared_definitions.h" ; Mailbox from/to p2_deco.c -#include "tft_outputs.inc" -#include "strings.inc" -#include "tft.inc" -#include "eeprom_rs232.inc" -#include "isr.inc" -#include "math.inc" -#include "wait.inc" -#include "customview.inc" -#include "start.inc" -#include "adc_lightsensor.inc" -#include "ghostwriter.inc" +#include "hwos.inc" ; Mandatory header +#include "shared_definitions.h" ; Mailbox from/to p2_deco.c +#include "tft_outputs.inc" +#include "strings.inc" +#include "tft.inc" +#include "eeprom_rs232.inc" +#include "isr.inc" +#include "math.inc" +#include "wait.inc" +#include "customview.inc" +#include "start.inc" +#include "adc_lightsensor.inc" +#include "ghostwriter.inc" #include "i2c.inc" #include "calibrate.inc" #include "convert.inc" @@ -31,136 +31,273 @@ global diveloop diveloop: banksel common - call speed_normal - call diveloop_boot ; Boot tasks for all modes + call speed_normal + call diveloop_boot ; Boot tasks for all modes -; Startup Tasks for all modes - call TFT_boot ; Initialize TFT (includes clear screen) - call TFT_divemode_mask ; Display mask - call TFT_temp_divemode ; Displays temperature - movff customview_divemode,menupos3 ; Reload last customview - call customview_mask ; Redraw last custom view + ; Startup Tasks for all modes + call TFT_boot ; Initialize TFT (includes clear screen) + bsf FLAG_TFT_divemode_mask ; Display mask + movff customview_divemode,menupos3; Reload last customview + call customview_mask ; Redraw last custom view - btfsc FLAG_apnoe_mode - bsf realdive ; Set Realdive flag in Apnoe mode + btfsc FLAG_apnoe_mode + bsf realdive ; Set Realdive flag in Apnoe mode - btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode - bra diveloop_loop - btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode - bra diveloop_loop + btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode + bra diveloop_loop_start + btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode + bra diveloop_loop_start - call TFT_active_gas_divemode ; Display gas/Setpoint - call TFT_display_ndl_mask ; display "NDL" + bsf FLAG_TFT_display_ndl_mask ; display "NDL" ; +@5 init - setf WREG ; WAIT marker: display "---" - movff WREG,int_O_extra_ascenttime+0 - movff WREG,int_O_extra_ascenttime+1 - movlw 1 - movwf apnoe_mins ; Start compute after next cycle. + clrf WREG ; WAIT marker: display "---" + movff WREG,char_I_sim_advance_time; bank safe clrf + movff WREG,int_O_alternate_ascenttime+0 + bsf WREG,int_not_yet_computed + bsf WREG,int_invalid_flag + movff WREG,int_O_alternate_ascenttime+1 + +diveloop_loop_start: + btfsc FLAG_TFT_display_ndl_mask + call TFT_display_ndl_mask + + +diveloop_loop: ; The diveloop starts here + btfss quarter_second_update + bra diveloop_loop4a -;-------------------------------------------------------------------------------------------------------- -diveloop_loop: ; The diveloop starts here + ; tasks any 1/4 second, any mode + bcf quarter_second_update ; clear flag + + movlw .6 + cpfseq menupos3 ; in compass view? + bra diveloop_loop4a ; No, done. + + btfsc alternative_divelayout ; In alternative layout mode? + bra diveloop_loop4a ; Yes, done. No Compass. + +; TFT Output routines + extern TFT_dive_compass_heading + call TFT_dive_compass_heading ; Yes, update compass heading value + bsf FLAG_TFT_temp_divemode ; Redraw temperature (Is slighty affected from compass heading arrow) +; TFT Output routines + +diveloop_loop4a: btfss onesecupdate bra diveloop_loop3 - + ; tasks any new second... - bcf onesecupdate ; one seconds update, clear flag here in case it's set again in ISR before all tasks are done. + bcf onesecupdate ; one seconds update, clear flag here in case it's set again in ISR before all tasks are done. - btfsc FLAG_apnoe_mode ; Only in apnoe mode - bra diveloop_loop1b ; One Second Tasks in Apnoe mode + ;bsf LEDg ; ### DEBUG - used to measure the time used by all deco code to see if there is enough margin each second ### - call TFT_divemins ; Display (new) divetime! - call customview_second ; Do every-second tasks for the custom view area - call divemode_check_for_warnings ; Check for any warnings + ; display depth based on full seconds interval (nicer blinking) + btfss alternative_divelayout + rcall TFT_output4_normal + btfsc alternative_divelayout + rcall TFT_output4_alternative + + btfsc FLAG_apnoe_mode ; Only in apnoe mode + bra diveloop_loop1b ; One Second Tasks in Apnoe mode + +; tasks any new second - only for deco modes + bsf FLAG_TFT_divemins ; Display (new) divetime! + btfsc show_safety_stop ; Show the safety stop? + bsf FLAG_TFT_show_safety_stop ; Yes, show/delete if done. -; Tasks only for deco modes - btfsc show_safety_stop ; Show the safety stop? - call TFT_show_safety_stop ; Yes, show/delete if done. - call calc_deko_divemode ; calculate decompression and display result (any two seconds) - bra diveloop_loop1x ; Common Tasks + btfss alternative_divelayout + rcall TFT_output1_normal + btfsc alternative_divelayout + rcall TFT_output1_alternative + btfsc FLAG_ccr_mode ; In CCR mode... + call check_dive_autosp ; ...check for Auto-SP + + call calc_deko_divemode ; calculate decompression and set resulting display flags + + btfss alternative_divelayout + rcall TFT_output2_normal + btfsc alternative_divelayout + rcall TFT_output2_alternative + + call divemode_check_for_warnings ; Check for any warnings + + bra diveloop_loop1x ; Common Tasks + + +; tasks any new second - only for apnoe mode diveloop_loop1b: -; Tasks only for Apnoe mode - rcall divemode_apnoe_tasks ; 1 sec. Apnoe tasks - call customview_second ; Do every-second tasks for the custom view area - ; bra diveloop_loop1x ; Common Tasks + rcall divemode_apnoe_tasks ; 1 sec. Apnoe tasks + call customview_second ; Do every-second tasks for the custom view area + ;bra diveloop_loop1x ; Common Tasks + +; continue tasks any new second, any mode diveloop_loop1x: -; Common 1sec. tasks for all modes - rcall timeout_divemode ; dive finished? This routine sets the required flags - rcall set_dive_modes ; tests if depth>threshold - rcall set_min_temp ; store min. temp if required (Future hardware will need this to be checked 1/second...) - - btfsc store_sample ; store new sample? - call store_dive_data ; Store profile data - - btfss divemode ; Dive finished? - goto ghostwriter_end_dive ; Dive finished! + rcall timeout_divemode ; ** menu timeout? ** This routine sets the required flags + rcall set_dive_modes ; tests if depth>threshold + rcall set_min_temp ; store min. temp if required (Future hardware will need this to be checked 1/second...) - btfsc divemode_gaschange ; Gas switch flag set? - rcall gas_switched_common ; Yes + btfsc oneminupdate ; one minute tasks + rcall update_divemode60 ; Update clock, etc. - btfsc toggle_gf ; =1: Toggle GF/aGF - rcall divemodemode_togglegf ; Toggle aGF/GF + btfss alternative_divelayout + rcall TFT_output3_normal + btfsc alternative_divelayout + rcall TFT_output3_alternative + + ;bcf LEDg ; ### DEBUG - used to measure the time used by all deco code to see if there is enough margin each second ### - btfsc FLAG_ccr_mode ; In CCR mode... - call check_dive_autosp ; ...check for Auto-SP - +; tasks any round, any mode diveloop_loop3: - rcall test_switches_divemode ; Check switches in divemode - + call test_switches_divemode ; Check switches in divemode + global diveloop_loop4 -diveloop_loop4: ; Menu-Exit returns here... - btfsc toggle_customview ; Next view? - call customview_toggle ; Yes, show next customview (and delete this flag) +diveloop_loop4: ; Menu-Exit returns here... + btfsc divemode_menu ; in the big divemode menu? + bra diveloop_loop4b ; YES - no space for CCR/pSCR info + btfsc menuview ; NO - in the small yellow menu? + bra diveloop_loop4b ; YES - no space for CCR/pSCR info + btfsc alternative_divelayout ; NO - in the alternative layout? + bra diveloop_loop4b ; YES - no space for CCR/pSCR info + call TFT_show_mode_divemode ; NO - (re)write CCR/pSCR mode info to display +diveloop_loop4b: + btfsc toggle_customview ; Next view? + call customview_toggle ; Yes, show next customview (and delete this flag) - btfsc pressure_refresh ; new pressure available? - rcall update_temp_and_or_depth ; Yes, display new depth and clear "pressure_refresh" flag + btfsc store_sample ; store new sample? + call store_dive_data ; Store profile data - btfsc oneminupdate ; one minute tasks - rcall update_divemode60 ; Update clock, etc. + btfss divemode ; Dive finished? + goto ghostwriter_end_dive ; Dive finished! -; btfss quarter_second_update -; bra diveloop_loop4a + btfsc divemode_gaschange ; Gas switch flag set? + call gas_switched_common ; Yes - bcf quarter_second_update - movlw .6 - cpfseq menupos3 ; in compass view? - bra diveloop_loop4a ; No - extern TFT_dive_compass_heading - call TFT_dive_compass_heading ; Yes, update compass heading value - call TFT_temp_divemode ; Redraw temperature (Is slighty affected from compass heading arrow) -diveloop_loop4a: - btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) + btfsc toggle_gf ; =1: Toggle GF/aGF + rcall divemodemode_togglegf ; Toggle aGF/GF + + btfsc pressure_refresh ; new pressure available? + rcall set_max_depth ; update max. depth if required + btfsc pressure_refresh ; new pressure available? + bsf FLAG_TFT_depth ; Yes, update depth asap + bcf pressure_refresh ; clear flag + + btfsc temp_changed + bsf FLAG_TFT_temp_divemode ; Displays temperature + + ; display depth based on as-fast-as-possible (no nice blinking) + ;btfss alternative_divelayout + ;rcall TFT_output4_normal + ;btfsc alternative_divelayout + ;rcall TFT_output4_alternative + + btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) bra diveloop_loop5 bra diveloop_loop6 + diveloop_loop5: - btfss vusb_in ; USB (still) plugged in? - bcf enable_screen_dumps ; No, clear flag + btfss vusb_in ; USB (still) plugged in? + bcf enable_screen_dumps ; No, clear flag call rs232_get_byte btfsc rs232_recieve_overflow bra diveloop_loop6 movlw "l" cpfseq RCREG1 bra diveloop_loop6 - call TFT_dump_screen ; Dump the screen contents + call TFT_dump_screen ; Dump the screen contents + diveloop_loop6: + bra diveloop_loop ; Loop the divemode + +;-------------------------------------------------------------------------------------------------------- + +TFT_output1_normal: ; beginning of any new second - only for deco modes + btfsc FLAG_TFT_divemode_mask + call TFT_divemode_mask + btfsc FLAG_TFT_divemins + call TFT_divemins ; Display (new) divetime! + call customview_second ; Do every-second tasks for the custom view area (In sync with the divetime) mH + btfsc FLAG_TFT_show_safety_stop + call TFT_show_safety_stop ; Show safety stop + btfsc FLAG_TFT_clear_safety_stop + call TFT_clear_safety_stop ; Clear safety stop + return + +TFT_output1_alternative: ; beginning of any new second - only for deco modes + btfsc FLAG_TFT_divemins + call TFT_divemins_alternative ; Display (new) divetime! + btfsc FLAG_TFT_divemode_mask_alt + call TFT_divemode_mask_alternative ; Alt. mask + call customview_alternative_second ; Do every-second tasks for the custom view area (In sync with the divetime) mH + return + +TFT_output2_normal: ; any new second - only for deco modes + btfsc FLAG_TFT_display_ndl_mask + call TFT_display_ndl_mask + btfsc FLAG_TFT_display_ndl + call TFT_display_ndl + btfsc FLAG_TFT_display_deko_mask + call TFT_display_deko_mask + btfsc FLAG_TFT_display_deko + call TFT_display_deko + btfsc FLAG_TFT_display_tts + call TFT_display_tts + return - bra diveloop_loop ; Loop the divemode +TFT_output2_alternative: ; any new second - only for deco modes + return + +TFT_output3_normal: ; tasks any new second, any mode + btfsc FLAG_TFT_max_depth + call TFT_max_depth ; use normal max. depth + btfsc FLAG_TFT_divemode_warning + call TFT_divemode_warning + btfsc FLAG_TFT_divemode_warning_clear + call TFT_divemode_warning_clear + btfsc FLAG_TFT_active_gas_divemode + call TFT_active_gas_divemode ; Display gas/Setpoint + btfsc FLAG_TFT_dive_warning_text_clear + call TFT_clear_warning_text ; clear complete warnings area + btfsc FLAG_TFT_dive_warning_text_clr2 + call TFT_clear_warning_text_2nd_row ; clear 2nd row of warnings + return + +TFT_output3_alternative: ; tasks any new second, any mode + btfsc FLAG_TFT_max_depth_alt + call TFT_max_depth_alternative ; big max. depth + btfsc FLAG_TFT_dive_warning_text_clear + call TFT_clear_warning_text ; clear complete warnings area (In alt mode only 2nd. row...) + btfsc FLAG_TFT_big_deco_alt + call TFT_big_deco_alt ; Big deco + return + +TFT_output4_normal: ; tasks any round, any mode + btfsc FLAG_TFT_depth + call TFT_depth ; Displays new depth + btfsc FLAG_TFT_temp_divemode + call TFT_temp_divemode ; Update temperature + return + +TFT_output4_alternative: ; tasks any round, any mode + btfsc FLAG_TFT_depth + call TFT_depth ; Displays new depth + return + + ;-------------------------------------------------------------------------------------------------------- +divemode_apnoe_tasks: ; 1 sec. Apnoe tasks + call TFT_display_apnoe_descent ; Yes, Show descent timer + call TFT_max_depth ; use normal max. depth -divemode_apnoe_tasks: ; 1 sec. Apnoe tasks - call TFT_display_apnoe_descent ; Yes, Show descent timer - call TFT_max_pressure ; use normal max. depth - - btfsc divemode2 ; Time running? - bra divemode_apnoe_tasks2 ; New descent, reset data if flag is set + btfsc divemode2 ; Time running? + bra divemode_apnoe_tasks2 ; New descent, reset data if flag is set rcall apnoe_calc_maxdepth call TFT_display_apnoe_surface - call TFT_display_apnoe_last_max ; Show last max. depth + call TFT_display_apnoe_last_max ; Show last max. depth incf apnoe_surface_secs,F movlw d'60' cpfseq apnoe_surface_secs @@ -169,26 +306,26 @@ incf apnoe_surface_mins,F divemode_apnoe_tasks1: - bcf FLAG_active_descent ; Clear flag - btfsc divemode2 ; Time running? - return ; Yes, return - bsf FLAG_active_descent ; Set Flag + bcf FLAG_active_descent ; Clear flag + btfsc divemode2 ; Time running? + return ; Yes, return + bsf FLAG_active_descent ; Set Flag return divemode_apnoe_tasks2: - btfss FLAG_active_descent ; Are we descending? - return ; No, We are at the surface - rcall apnoe_calc_maxdepth ; Yes! - call TFT_apnoe_clear_surface ; Clear Surface timer - clrf apnoe_timeout_counter ; Delete timeout + btfss FLAG_active_descent ; Are we descending? + return ; No, We are at the surface + rcall apnoe_calc_maxdepth ; Yes! + call TFT_apnoe_clear_surface ; Clear Surface timer + clrf apnoe_timeout_counter ; Delete timeout clrf apnoe_surface_secs clrf apnoe_surface_mins clrf apnoe_secs - clrf apnoe_mins ; Reset Descent time + clrf apnoe_mins ; Reset Descent time movlw .0 movff WREG,max_pressure+0 - movff WREG,max_pressure+1 ; Reset Max. Depth - bcf FLAG_active_descent ; Clear flag + movff WREG,max_pressure+1 ; Reset Max. Depth + bcf FLAG_active_descent ; Clear flag return global apnoe_calc_maxdepth @@ -197,259 +334,341 @@ movff apnoe_max_pressure+1,sub_a+1 movff max_pressure+0,sub_b+0 movff max_pressure+1,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b - ; apnoe_max_pressure<max_pressure -> neg_flag=1 - ; max_pressure<=apnoe_max_pressure -> neg_flag=0 + call subU16 ; sub_c = sub_a - sub_b + ; apnoe_max_pressure<max_pressure -> neg_flag=1 + ; max_pressure<=apnoe_max_pressure -> neg_flag=0 btfss neg_flag return - ;apnoe_max_pressure<max_pressure + ;apnoe_max_pressure<max_pressure movff max_pressure+0,apnoe_max_pressure+0 movff max_pressure+1,apnoe_max_pressure+1 return + ; -------------------------------------------------------------------------------------- calc_deko_divemode: - btfsc twosecupdate ; two seconds after the last call - bra calc_deko_divemode2 ; Yes, calculate and display deco data ("first second") - - bsf twosecupdate ; No, but next second! - ; Routines used in the "other second" - call calc_average_depth ; calculate average depth - call calc_velocity ; calculate vertical velocity and display if > threshold (every two seconds) - call set_reset_safety_stop ; Set flags for safety stop and/or reset safety stop + rcall calc_deko_divemode2 ; all deco relevant code is now invoked every second + btfsc twosecupdate + bra calc_deko_divemode1 + bsf twosecupdate + return + +calc_deko_divemode1: ; the following code is invoked every 2 seconds + bcf twosecupdate + + call calc_average_depth ; calculate average depth + call calc_velocity ; calculate vertical velocity and display if > threshold (every two seconds) + call set_reset_safety_stop ; Set flags for safety stop and/or reset safety stop call TFT_debug_output - btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode - return - btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode + btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode + return + btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode + return + +; Check for a gas change + goto check_gas_change ; Checks if a better gas should be selected (by user) and return... + + +calc_deko_divemode2: + btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode return -; Calculate CNS - btfss FLAG_pscr_mode ; in PSCR mode? - rcall set_actual_ppo2 ; No, set char_I_actual_ppO2 - btfsc is_bailout ; Always in bailout... - rcall set_actual_ppo2 ; ...set char_I_actual_ppO2 - - clrf WREG - movff WREG,char_I_step_is_1min ; Make sure to be in 2sec mode. - call deco_calc_CNS_fraction ; calculate CNS - movlb b'00000001' ; rambank 1 selected -; Check for a gas change - bra check_gas_change ; Checks if a better gas should be selected (by user) and return... + btfsc FLAG_ccr_mode ; In CCR mode? + rcall calc_deko_divemode_sensor ; do sensor data acquisition if applicable by OSTC model - global set_actual_ppo2 -set_actual_ppo2: ; calculate ppO2 in 0.01bar (e.g. 150 = 1.50 bar ppO2) - btfsc divemode ; in divemode - bra set_actual_ppo2_dive ; Yes - ; No, use simulated ambient pressure for char_I_actual_ppO2 - movff char_I_bottom_depth,WREG - mullw .100 - movlw LOW(.1000) - addwf PRODL,W - movwf xA+0 - movlw HIGH(.1000) - addwfc PRODH,W - movwf xA+1 ; P_amb in millibar (1000 = 1.00 bar). - bra set_actual_ppo2_common -set_actual_ppo2_dive: - SAFE_2BYTE_COPY amb_pressure, xA ; P_amb in millibar (1000 = 1.00 bar). -set_actual_ppo2_common: - movlw d'10' - movwf xB+0 - clrf xB+1 - call div16x16 ; xC=p_amb/10 (100 = 1.00 bar). - movff xC+0,xA+0 - movff xC+1,xA+1 - movff char_I_O2_ratio,xB+0 - clrf xB+1 - call mult16x16 ; char_I_O2_ratio * (p_amb/10) - movff xC+0,xA+0 - movff xC+1,xA+1 - movlw d'100' - movwf xB+0 - clrf xB+1 - call div16x16 ; xC=(char_I_O2_ratio * p_amb/10)/100 - -; Copy ppO2 for CNS calculation - tstfsz xC+1 ; Is ppO2 > 2.55bar ? - setf xC+0 ; yes: bound to 2.55... better than wrap around. - - movff xC+0, char_I_actual_ppO2 ; copy last ppO2 to buffer register - btfsc is_bailout ; In Bailout? - return ; Yes, done. - ; No Bailout, check for ccr mode - btfsc FLAG_ccr_mode ; If FLAG_ccr_mode=1... - movff char_I_const_ppO2, char_I_actual_ppO2 ; ...copy last ppO2 to buffer register - return - -check_fallback_clear: - call check_sensors ; Setups "use_O2_sensorX" flags - ; Copy use flags to voting logic flags in case we are no longer in fallback - btfsc use_O2_sensor1 - bsf voting_logic_sensor1 - btfsc use_O2_sensor2 - bsf voting_logic_sensor2 - btfsc use_O2_sensor3 - bsf voting_logic_sensor3 - rcall divemode_setup_sensor_values ; Setup sensor values - goto check_sensors ; Check O2 sensor thresholds for fallback customview_minute - -calc_deko_divemode2: - bcf twosecupdate - - btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode - return - - extern deco_setup_dive - call deco_setup_dive ; Pass all parameters to the C code + btfsc FLAG_pscr_mode ; In PSCR mode? + rcall calc_deko_divemode_sensor ; do sensor data acquisition if applicable by OSTC model + + SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; transfer ambient pressure to deco engine - btfsc setpoint_fallback ; Are we in Fallback? - rcall check_fallback_clear ; Yes, check if we still have fallback condition - - bcf setpoint_fallback ; =1: Fallback to SP1 due to external O2 sensor failure - - btfsc FLAG_ccr_mode ; In CCR mode? - rcall calc_deko_divemode_sensor ; External sensor stuff - -; btfsc FLAG_pscr_mode ; In PSCR mode? -; rcall calc_deko_divemode_sensor ; External sensor stuff + ; check deco engine state and switch between normal and alternative plan calculations + ; + ; Remark: Any reconfigurations done here do only affect the ascent & deco calculation settings, + ; not the settings for the calculations done on the real tissues. The later ones are only + ; altered in case of a gas change, or in case of a real bailout or switchback to setpoint + ; or sensor, respectively. + ; In case of a gas change or real bailout/switchback, the settings for the deco calculations + ; are also changed to match the settings for the real tissues. This is done on signal through + ; 'divemode_gaschange' and will also leave the deco engine status in state as if having done + ; the alternative plan last. + + ; check state of ascent/deco calculations + movff char_O_deco_status,lo ; get a working copy of char_O_deco_status into bank common + movlw DECO_STATUS_MASK ; load bit mask covering the deco status bits + andwf lo,W ; mask out bits showing deco engine computations state + tstfsz WREG ; check if the last compute cycle has finished (bits 1 and 0 cleared) + bra calc_deko_divemode2e ; NO - computations still in progress, needs more computation cycles + btfss lo,DECO_PLAN_FLAG ; YES - computation cycle finished, so check what has been computed + bra calc_deko_divemode2b ; PLAN bit is cleared i.e. normal plan was done, may do alternative next - - SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; C-code needs the ambient pressure - clrf WREG - movff WREG,char_I_step_is_1min ; Force 2 second deco mode + ; The PLAN bit is set, i.e. an alternative plan was computed in the last cycle, or the deco engine has + ; been restarted because of a gas change etc. --> Reconfigure to normal plan for next computation cycle. + + ; reset flags for special calculations + bcf lo,DECO_PLAN_FLAG ; clear flag for alternative plan + bcf lo,DECO_ASCENT_FLAG ; clear flag for delayed ascent calculation + bcf lo,DECO_VOLUME_FLAG ; clear flag for gas needs calculation + movff lo,char_O_deco_status ; write-back char_O_deco_status to deco engine interface - movff char_I_O2_ratio,lo_temp ; Backup original value for everything - movff char_I_N2_ratio,hi_temp ; Backup original value for everything - - btfss FLAG_pscr_mode - bra calc_deko_divemode2a ; Non-PSCR modes... + ; check if a switchback from CCR or pSCR bailout calculation is to be done + btfsc FLAG_ccr_mode ; may a switchback from a CCR bailout calculation be needed? + bra calc_deko_divemode2a ; in CCR mode, so may need to switch back from bailout calculation + btfsc FLAG_pscr_mode ; may a switchback from a pSCR bailout calculation be needed? + bra calc_deko_divemode2a ; in pSCR mode, so may need to switch back from bailout calculation + bra calc_deko_divemode2e ; not in CCR nor pSCR, so no switchback needed, start normal plan now + ; (first cycle omits gas needs calculation in OC without delayed ascent) - btfsc is_bailout - bra calc_deko_divemode2a ; Skip in bailout + ; switch back to loop calculation if last cycle was doing a bailout calculation +calc_deko_divemode2a: + movff opt_calc_asc_gasvolume,hi ; get the gas volume needs calculation setting + movf hi,W ; are gas volume calculations turned on? + bz calc_deko_divemode2e ; NO - can't have done a bailout calculation then, start normal plan + btfsc is_bailout ; YES - check if a real bailout situation is present + bra calc_deko_divemode2e ; YES - OC gases have been set by bailout action then, start normal plan + movff active_gas,WREG ; NO - switch back to loop calculation: get current (diluent) gas, ... + call deco_setup_cc_diluents ; ... set up deco calculations in CCR/pSCR mode with diluents, + bra calc_deko_divemode2e ; ... and start in normal plan mode + + ; The PLAN bit was cleared, i.e. a normal plan was computed in the last cycle. For the next + ; computation cycle the mode may be switched to alternative plan, or stay in normal mode... - ; in PSCR mode, compute fO2 into char_I_O2_ratio - call compute_pscr_ppo2 ; pSCR ppO2 into sub_c:2 - movff sub_c+0,xA+0 - movff sub_c+1,xA+1 - movlw LOW .10 - movwf xB+0 - movlw HIGH .10 - movwf xB+1 - call mult16x16 ;xA*xB=xC -> xC:4 = ppO2*10 - SAFE_2BYTE_COPY amb_pressure, xB - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - ; xC+0 has O2 in percent - movff xC+0,char_I_O2_ratio +calc_deko_divemode2b: + bcf lo,DECO_ASCENT_FLAG ; clear flag for delayed ascent calculation (for safety only) + btfsc is_bailout ; check if a real bailout situation is present + bra calc_deko_divemode2c ; YES - stay in normal plan mode and preclude delayed ascent calculation + movff char_I_extra_time,hi ; NO - get the delayed ascent setting + tstfsz hi ; check if delayed ascent calculation is enabled + bsf lo,DECO_ASCENT_FLAG ; YES - set flag for delayed ascent calculation + tstfsz hi ; check if delayed ascent calculation is enabled (again) + bsf lo,DECO_PLAN_FLAG ; YES - set flag for alternative plan - movff char_I_He_ratio, wait_temp ; copy into bank1 register - bsf STATUS,C ; Borrow bit - movlw d'100' ; 100% - subfwb wait_temp,W ; minus He - bsf STATUS,C ; Borrow bit - subfwb xC+0,W ; minus O2 - movff WREG, char_I_N2_ratio ; = N2! + ; check if a gas needs calculation shall be done +calc_deko_divemode2c: + bsf lo,DECO_VOLUME_FLAG ; set gas needs calculation flag (may be cleared again next) + TSTOSS opt_calc_asc_gasvolume ; check if gas needs calculation is enabled + bcf lo,DECO_VOLUME_FLAG ; NO - reset flag again + movff lo,char_O_deco_status ; write-back char_O_deco_status to deco engine interface + TSTOSS opt_calc_asc_gasvolume ; check if gas volume calculation is enabled (again) + bra calc_deko_divemode2e ; NO - no volume calculation, no simulated bailout plan in no case -calc_deko_divemode2a: + ; check if conditions are met to calculate a bailout plan + btfsc is_bailout ; check if a real bailout situation is present + bra calc_deko_divemode2e ; YES - normal plan already does bailout (OC) calculation "for real" + btfss lo,DECO_MODE_LOOP_FLAG ; NO - have loop mode calculation been done during the normal plan? + bra calc_deko_divemode2e ; NO - when not in loop mode, no simulated bailout to be done + bsf lo,DECO_PLAN_FLAG ; YES - set flag for alternative plan + movff lo,char_O_deco_status ; write-back char_O_deco_status to deco engine interface + call get_first_gas_to_WREG ; get first OC gas, ... + call deco_setup_oc_gases ; ... set up deco calculations in OC mode with OC gases, + ;bra calc_deko_divemode2e ; ... and start in alternative plan mode + + +calc_deko_divemode2e: clrf TMR5L clrf TMR5H ; 30,51757813µs/bit in TMR5L:TMR5H call deco_calc_hauptroutine ; calc_tissue - movlb .1 - - movff lo_temp,char_I_O2_ratio ; Restore original value for everything - movff hi_temp,char_I_N2_ratio ; Restore original value for everything - - - movff char_O_deco_status,WREG ; Is a compute cycle finished ? - iorwf WREG,F - btfss STATUS,Z - return ; Return is status <> 0 + banksel common ; Check if deco stops are necessary ? movff char_O_first_deco_depth,wait_temp ; copy ceiling to temp register tstfsz wait_temp ; Ceiling<0m? bra calc_deko_divemode3 ; Yes! - btfsc decostop_active ; Already in nodeco mode ? - call TFT_display_ndl_mask ; No, Clear deco data, display nostop time - bcf decostop_active ; clear flag (again) + btfsc decostop_active ; Already in nodeco mode ? + bsf FLAG_TFT_display_ndl_mask ; No, Clear deco data, display nostop time + bcf decostop_active ; clear flag (again) ; Copy for profile recording clrf decodata+0 - movff char_O_nullzeit,decodata+1 ; NDL + movff char_O_nullzeit,decodata+1 ; NDL - goto TFT_display_ndl ; display no deco limit, and return... + bsf FLAG_TFT_display_ndl ; display no deco limit + return calc_deko_divemode3: - btfss decostop_active ; Already in deco mode ? - call TFT_display_deko_mask ; No, clear nostop time, display decodata - bsf decostop_active ; Set flag (again) + btfss decostop_active ; Already in deco mode ? + bsf FLAG_TFT_display_deko_mask ; No, clear nostop time, display decodata + bsf decostop_active ; Set flag (again) ; Copy for profile recording movff char_O_first_deco_depth,decodata+0 ; ceiling - movff char_O_first_deco_time,decodata+1 ; length of first stop in minues - call TFT_display_deko ; display decodata - call TFT_show_TTS_divemode ; display TTS + movff char_O_first_deco_time,decodata+1 ; length of first stop in minutes + bsf FLAG_TFT_display_deko ; display decodata + bsf FLAG_TFT_display_tts ; display TTS + return + + ; -------------------------------------------------------------------------------------- - movff char_I_extra_time,WREG - tstfsz WREG ; extra time = 0? - bra calc_deko_divemode4 ; No, compute it - return + global calc_deko_divemode_sensor +calc_deko_divemode_sensor: + ; sensor acquisition code + btfss s8_digital ; check if we have digital interface to the sensors + bra calc_deko_divemode_sensor_analog ; NO - use analog interface + btfss new_s8_data_available ; YES - check if a new data frame was received + bra calc_deko_divemode_sensor_common ; NO - use old values + call compute_mvolts_for_all_sensors ; YES - compute mV values from digital data + bra calc_deko_divemode_sensor_common + +calc_deko_divemode_sensor_analog: + call get_analog_inputs ; TODO: abort when OSTC model does not have analog inputs + +calc_deko_divemode_sensor_common: + ; Check for each sensor if it is calibrated and if its mv value is within min_mv and max_mv limits. + ; If ok: compute o2_ppo2_sensorX := o2_mv_sensorX * opt_x_sX / 1000. + ; If not ok: reset o2_ppo2_sensorX, reset use_O2_sensorX and show the customview 1 in case the sensor was ok before. -calc_deko_divemode4: - ; Check if extra cycles are needed to compute @5 variant: - decfsz apnoe_mins,F ; Reached count-down ? - return ; No: don't compute yet. - - movlw .6 - movff WREG,char_O_deco_status ; Stole next cycles for @5 variant. - - movlw .2 ; Restart countdown. - movwf apnoe_mins - return ; done. + ; Check min_mv of sensor 1 + btfss sensor1_calibrated_ok ; check if sensor is usable at all + bra check_sensor_1_fail ; NO - handle it as failed + movff o2_mv_sensor1+0, sub_a+0 ; load sensor mV value + movff o2_mv_sensor1+1, sub_a+1 + movlw LOW min_mv ; load minimum mV value + movwf sub_b+0 + movlw HIGH min_mv + movwf sub_b+1 + call sub16 ; sub_c = sensor_mv - min_mv + btfsc neg_flag ; check if result is negative, i.e. sensor_mv < min_mv + bra check_sensor_1_fail ; YES - declare sensor as failed + ; Check max_mv of sensor 1 NO - continue with next check + movff o2_mv_sensor1+0, sub_a+0 + movff o2_mv_sensor1+1, sub_a+1 + movlw LOW max_mv + movwf sub_b+0 + movlw HIGH max_mv + movwf sub_b+1 + call sub16 ; sub_c = sensor_mv - max_mv + btfss neg_flag ; check if result is negative, i.e. sensor_mv < max_mv + bra check_sensor_1_fail ; NO - declare sensor as failed + ; Check HUD data, if available YES - continue with next check + btfss hud_connection_ok ; check if there is a HUD connected + bra check_sensor_1_ok ; NO - all checks done then and positive + btfss sensor1_active ; YES - check HUD report on sensor + bra check_sensor_1_fail ; HUD reports a fail + +check_sensor_1_ok: + ; o2_ppo2_sensor1 := o2_mv_sensor1:2 * opt_x_s1:2 / 1000 + movff o2_mv_sensor1+0,xA+0 + movff o2_mv_sensor1+1,xA+1 + movff opt_x_s1+0,xB+0 + movff opt_x_s1+1,xB+1 + rcall compute_ppo2_helper + movff xC+0,o2_ppo2_sensor1 ; result in 0.01bar + bra check_sensor_2 ; continue with next sensor + +check_sensor_1_fail: + clrf WREG + movff WREG,o2_ppo2_sensor1 ; set ppO2 reading to zero + btfss use_O2_sensor1 ; check if sensor was in use before + bra check_sensor_1_fail_1 ; NO - no new news then + call check_sensor_custview_helper ; YES - show customview 1 (sensor values) on further conditions met +check_sensor_1_fail_1: + bcf use_O2_sensor1 ; revoke sensor from usage + ;bra check_sensor_2 ; continue with next sensor -calc_deko_divemode_sensor: ; External sensor stuff - call compute_ppo2 ; computes o2_ppo2_sensorX from mV-Readings - call check_sensors ; analyses mv-Readings to set up use- and voting-Flags - call divemode_setup_sensor_values ; computes sensor_setpoint from o2_pp02_sensorX and Flags - - movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP - sublw .1 ; opt_ccr_mode = 1 (Sensor)? - bnz calc_deko_divemode_sensor_done ; No, return - - movff sensor_setpoint,char_I_const_ppO2; Copy sensor result to C-code +check_sensor_2: ; Check min_mv of sensor 2 + btfss sensor2_calibrated_ok ; check if sensor is usable at all + bra check_sensor_2_fail ; NO - handle it as failed + movff o2_mv_sensor2+0, sub_a+0 ; load sensor mV value + movff o2_mv_sensor2+1, sub_a+1 + movlw LOW min_mv ; load minimum mV value + movwf sub_b+0 + movlw HIGH min_mv + movwf sub_b+1 + call sub16 ; sub_c = sensor_mv - min_mv + btfsc neg_flag ; check if result is negative, i.e. sensor_mv < min_mv + bra check_sensor_2_fail ; YES - declare sensor as failed + ; Check max_mv of sensor 2 NO - continue with next check + movff o2_mv_sensor2+0, sub_a+0 + movff o2_mv_sensor2+1, sub_a+1 + movlw LOW max_mv + movwf sub_b+0 + movlw HIGH max_mv + movwf sub_b+1 + call sub16 ; sub_c = sensor_mv - max_mv + btfss neg_flag ; check if result is nagative, i.e. sensor_mv < max_mv + bra check_sensor_2_fail ; NO - declare sensor as failed + ; Check HUD data, if available YES - continue with next check + btfss hud_connection_ok ; check if there is a HUD connected + bra check_sensor_2_ok ; NO - all checks done then and positive + btfss sensor2_active ; YES - check HUD report on sensor + bra check_sensor_2_fail ; HUD reports a fail - TSTOSS opt_sensor_fallback ; =1: Fallback to SP1 when sensor is lost - return ; Never fallback +check_sensor_2_ok: + ; o2_ppo2_sensor2 := o2_mv_sensor2:2 * opt_x_s2:2 / 1000 + movff o2_mv_sensor2+0,xA+0 + movff o2_mv_sensor2+1,xA+1 + movff opt_x_s2+0,xB+0 + movff opt_x_s2+1,xB+1 + rcall compute_ppo2_helper + movff xC+0,o2_ppo2_sensor2 ; result in 0.01bar + bra check_sensor_3 ; continue with next sensor + +check_sensor_2_fail: + clrf WREG + movff WREG,o2_ppo2_sensor2 ; set ppO2 reading to zero + btfss use_O2_sensor2 ; check if sensor was in use before + bra check_sensor_2_fail_1 ; NO - no new news then + call check_sensor_custview_helper ; YES - show customview 1 (sensor values) on further conditions met +check_sensor_2_fail_1: + bcf use_O2_sensor2 ; revoke sensor from usage + ;bra check_sensor_3 ; continue with next sensor - btfsc is_bailout ; In bailout? - return ; Never fallback in bailout - ; Check if we should fallback to SP1 - btfsc use_O2_sensor1 - return ; At least one sensor is active, no fallback - btfsc use_O2_sensor2 - return ; At least one sensor is active, no fallback - btfsc use_O2_sensor3 - return ; At least one sensor is active, no fallback - ; No sensor in use -> fallback - movff char_I_setpoint_cbar+0,char_I_const_ppO2 ; Setup fixed Setpoint (Always fallback to SP1), overwrite sensor result - bsf setpoint_fallback ; =1: Fallback to SP1 due to external O2 sensor failure -calc_deko_divemode_sensor_done: - return - -;----------------------------------------------------------------------------- +check_sensor_3: ; Check min_mv of sensor 2 + btfss sensor3_calibrated_ok ; check if sensor is usable at all + bra check_sensor_3_fail ; NO - handle it as failed + movff o2_mv_sensor3+0, sub_a+0 ; load sensor mV value + movff o2_mv_sensor3+1, sub_a+1 + movlw LOW min_mv ; load minimum mV value + movwf sub_b+0 + movlw HIGH min_mv + movwf sub_b+1 + call sub16 ; sub_c = sensor_mv - min_mv + btfsc neg_flag ; check if result is negative, i.e. sensor_mv < min_mv + bra check_sensor_3_fail ; YES - declare sensor as failed + ; Check max_mv of sensor 2 NO - continue with next check + movff o2_mv_sensor3+0, sub_a+0 + movff o2_mv_sensor3+1, sub_a+1 + movlw LOW max_mv + movwf sub_b+0 + movlw HIGH max_mv + movwf sub_b+1 + call sub16 ; sub_c = sensor_mv - max_mv + btfss neg_flag ; check if result is nagative, i.e. sensor_mv < max_mv + bra check_sensor_3_fail ; NO - declare sensor as failed + ; Check HUD data, if available YES - continue with next check + btfss hud_connection_ok ; check if there is a HUD connected + bra check_sensor_3_ok ; NO - all checks done then and positive + btfss sensor3_active ; YES - check HUD report on sensor + bra check_sensor_3_fail ; HUD reports a fail -divemodemode_togglegf: ; Toggle aGF/GF - bcf toggle_gf ; clear flag - btg use_agf ; Toggle GF - call TFT_gf_mask ; Setup Mask - clrf WREG - movff WREG,char_O_deco_status ; Restart decoplan computation - return +check_sensor_3_ok: + ; o2_ppo2_sensor3 := o2_mv_sensor3:2 * opt_x_s1:2 / 1000 + movff o2_mv_sensor3+0,xA+0 + movff o2_mv_sensor3+1,xA+1 + movff opt_x_s3+0,xB+0 + movff opt_x_s3+1,xB+1 + rcall compute_ppo2_helper + movff xC+0,o2_ppo2_sensor3 ; result in 0.01bar + bra calc_deko_divemode_sensor1 ; continue with calculating sensor average - global divemode_setup_sensor_values -divemode_setup_sensor_values: +check_sensor_3_fail: + clrf WREG + movff WREG,o2_ppo2_sensor3 ; set ppO2 reading to zero + btfss use_O2_sensor3 ; check if sensor was in use before + bra check_sensor_3_fail_1 ; NO - no new news then + call check_sensor_custview_helper ; YES - show customview 1 (sensor values) on further conditions met +check_sensor_3_fail_1: + bcf use_O2_sensor3 ; revoke sensor from usage + ;bra calc_deko_divemode_sensor1 ; continue with calculating sensor average + +calc_deko_divemode_sensor1: ; calculate sensor average + ; exit here if not in divemode + btfss divemode + return + + ; compute sensor_setpoint := average of all o2_ppo2_sensorX of those sensors that have use_O2_sensorX == true ; sum up sensor values (in xA:2) and active sensors in (xB:2) clrf xB+0 clrf xB+1 @@ -457,8 +676,6 @@ clrf xA+1 btfss use_O2_sensor1 ; Sensor1 active? bra divemode_setup_sensor_values2 ; No -; btfss voting_logic_sensor1 ; Sensor within voting logic? -; bra divemode_setup_sensor_values2 ; No movf o2_ppo2_sensor1,W addwf xA+0 movlw .0 @@ -467,8 +684,6 @@ divemode_setup_sensor_values2: btfss use_O2_sensor2 ; Sensor2 active? bra divemode_setup_sensor_values3 ; No -; btfss voting_logic_sensor2 ; Sensor within voting logic? -; bra divemode_setup_sensor_values3 ; No movf o2_ppo2_sensor2,W addwf xA+0 movlw .0 @@ -477,18 +692,172 @@ divemode_setup_sensor_values3: btfss use_O2_sensor3 ; Sensor3 active? bra divemode_setup_sensor_values4 ; No -; btfss voting_logic_sensor3 ; Sensor within voting logic? -; bra divemode_setup_sensor_values4 ; No movf o2_ppo2_sensor3,W addwf xA+0 movlw .0 addwfc xA+1 ; Add into xA:2 incf xB+0,F ; Add a sensor + + ; Divide sum of sensor values by number of active sensors found. divemode_setup_sensor_values4: call div16x16 ; xA/xB=xC with xA+0 as remainder - movff xC+0,sensor_setpoint ; Copy result + movff xC+0,sensor_setpoint ; copy result + + ; set default value for pSCR mode: 0 = let p2_deco.c compute the ppO2 based on current dil gas and depth + ; will be overwritten later in case we are in sensor mode and have at least one usable sensor + clrf WREG ; preload a zero + btfsc FLAG_pscr_mode ; check if we are in pSCR mode + movff WREG,char_I_const_ppO2 ; YES - write 0 to char_I_const_ppo2, + ; it will be overwritten if we have a usable sensor reading + + btfsc is_bailout ; check if we are in bailout + bra calc_deko_divemode_sensor2 ; YES - no sensor data transfer to char_I_const_ppO2 in this case + movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP + sublw .1 ; opt_ccr_mode = 1 (Sensor)? + bnz calc_deko_divemode_sensor2 ; not in sensor mode - no transfer of sensor data to char_I_const_ppO2 + tstfsz xB+0 ; check if we have found at least one usable sensor + bra calc_deko_divemode_sensor1a ; YES - we have at least one usable sensor + bsf setpoint_fallback ; NO - we have NO usable sensors -> initiate fallback + btfss FLAG_ccr_mode ; check if we are in CCR mode + bra calc_deko_divemode_sensor2 ; NO - continue with voting logic flags + movff char_I_setpoint_cbar+0,char_I_const_ppO2 ; YES - select fixed setpoint no. 1 for fallback + bra calc_deko_divemode_sensor2 ; done - continue with voting logic flags +calc_deko_divemode_sensor1a: ; we have at least one usable sensor with a value > 0 + bcf setpoint_fallback ; clear fallback condition + movff sensor_setpoint,char_I_const_ppO2 ; transfer average sensor value to p2_deco.c code + ; bra calc_deko_divemode_sensor2 + +calc_deko_divemode_sensor2: + bsf voting_logic_sensor1 + movff o2_ppo2_sensor1,temp1 + rcall check_sensor_voting_helper + incfsz WREG ; Was Wreg=255? + bcf voting_logic_sensor1 ; No, ignore this sensor + + bsf voting_logic_sensor2 + movff o2_ppo2_sensor2,temp1 + rcall check_sensor_voting_helper + incfsz WREG ; Was Wreg=255? + bcf voting_logic_sensor2 ; No, ignore this sensor + + bsf voting_logic_sensor3 + movff o2_ppo2_sensor3,temp1 + rcall check_sensor_voting_helper + incfsz WREG ; Was Wreg=255? + bcf voting_logic_sensor3 ; No, ignore this sensor + + ; check if a warning shall be issued on sensor disagreement + + btfsc FLAG_ccr_mode ; check if we are in CCR mode + bra check_warn_sensor_1 ; YES - continue with further checks + btfsc FLAG_pscr_mode ; check if we are in pSCR mode + bra check_warn_sensor_1 ; YES - continue with further checks + bra check_warn_sensor_agree ; not in CCR and not in pSCR, so no warning +check_warn_sensor_1: ; we are in CCR or pSCR mode + btfsc is_bailout ; check if we are in bailout + bra check_warn_sensor_agree ; YES - no warning in this case + movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP + sublw .1 ; opt_ccr_mode = 1 (Sensor)? + bnz check_warn_sensor_agree ; not in sensor mode - no warning in this case + ; check sensor 1 + btfss sensor1_calibrated_ok ; check if sensor has a valid calibration + bra check_warn_sensor_2 ; NO - sensor can not cause a warning then + btfss use_O2_sensor1 ; YES - check if sensor is in use + bra check_warn_sensor_2 ; NO - sensor can not cause a warning then + btfsc voting_logic_sensor1 ; YES - check if sensor value is within agreement range + bra check_warn_sensor_2 ; YES - continue with next sensor + bcf sensors_agree ; NO - issue a warning + return + +check_warn_sensor_2: ; check sensor 2 + btfss sensor2_calibrated_ok ; check if sensor has a valid calibration + bra check_warn_sensor_3 ; NO - sensor can not cause a warning then + btfss use_O2_sensor2 ; YES - check if sensor is in use + bra check_warn_sensor_3 ; NO - sensor can not cause a warning then + btfsc voting_logic_sensor2 ; YES - check if sensor value is within agreement range + bra check_warn_sensor_3 ; YES - continue with next sensor + bcf sensors_agree ; NO - issue a warning + return + +check_warn_sensor_3: ; check sensor 2 + btfss sensor3_calibrated_ok ; check if sensor has a valid calibration + bra check_warn_sensor_agree ; NO - sensor can not cause a warning then + btfss use_O2_sensor3 ; YES - check if sensor is in use + bra check_warn_sensor_agree ; NO - sensor can not cause a warning then + btfsc voting_logic_sensor3 ; YES - check if sensor value is within agreement range + bra check_warn_sensor_agree ; YES - continue with next sensor + bcf sensors_agree ; NO - issue a warning + return + +check_warn_sensor_agree: + bsf sensors_agree + return + +compute_ppo2_helper: + call mult16x16 ;xA:2*xB:2=xC:4 + movlw LOW .1000 + movwf xB+0 + movlw HIGH .1000 + movwf xB+1 + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + movlw d'1' + addwf xC+0,W ; we are just interessed in the carry flag + movlw d'0' + addwfc xC+1,W ; we are still just interessed in the carry flag + tstfsz WREG ; ppO2 is higher than 2.55bar? + setf xC+0 ; Yes. return +check_sensor_custview_helper: + btfss divemode ; check if we are in divemode + return ; NO - not in dive mode, return + movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP + sublw .1 ; opt_ccr_mode = 1 (Sensors)? + bnz check_sensor_helper_1 ; NO - not using the sensors in the moment + clrf menupos3 ; YES - arm customview 1 (sensor values) + bsf toggle_customview ; and request a customview toggle +check_sensor_helper_1: + return + + +check_sensor_voting_helper: + movf temp1,W + cpfsgt sensor_setpoint + bra check_sensor_voting_common2 ; temp1<sensor_setpoint + ; temp1>sensor_setpoint + movf temp1,W + subwf sensor_setpoint,W + movwf temp1 +check_sensor_voting_common1: + movlw sensor_voting_logic_threshold ; Threshold in 0.01 bar + cpfsgt temp1 + retlw .255 ; Within range + retlw .0 ; Out of range +check_sensor_voting_common2: + ; temp1<sensor_setpoint + movf sensor_setpoint,W + subwf temp1,F + bra check_sensor_voting_common1 + +;----------------------------------------------------------------------------- + +divemodemode_togglegf: ; Toggle aGF/GF + bcf toggle_gf ; clear flag + btg use_agf ; toggle GF + + movff opt_GF_low,char_I_GF_Low_percentage + movff opt_GF_high,char_I_GF_High_percentage + + ; Overwrite GF if aGF is wanted + btfsc use_agf ; =1: Use aGF + movff opt_aGF_low,char_I_GF_Low_percentage + btfsc use_agf ; =1: Use aGF + movff opt_aGF_high,char_I_GF_High_percentage + + call TFT_gf_mask ; Setup Mask + goto restart_deco_engine ; ...and return + + calc_velocity: ; called every two seconds btfsc display_velocity bra calc_velocity1 ; Always update if already displayed @@ -501,7 +870,7 @@ movff sub_a+0,last_pressure_velocity+0 ; store old value for velocity movff sub_a+1,last_pressure_velocity+1 - call subU16 ; sub_c = amb_pressure - last_pressure + call subU16 ; sub_c = amb_pressure - last_pressure bcf neg_flag_velocity btfsc neg_flag @@ -509,20 +878,20 @@ movff sub_c+0,xA+0 movff sub_c+1,xA+1 - movlw d'39' ; 77 when called every second.... + movlw d'39' ; 77 when called every second.... movwf xB+0 clrf xB+1 - call mult16x16 ; differential pressure in mbar*77... + call mult16x16 ; differential pressure in mbar*77... movff xC+0,divA+0 movff xC+1,divA+1 movlw d'7' movwf divB+0 - call div16 ; devided by 2^7 equals velocity in m/min + call div16 ; devided by 2^7 equals velocity in m/min movlw d'99' - cpfsgt divA+0 ; limit to 99m/min + cpfsgt divA+0 ; limit to 99m/min bra calc_velocity3 - movwf divA+0 ; divA=99 + movwf divA+0 ; divA=99 calc_velocity3: ; Copy old speeds @@ -532,22 +901,22 @@ movff divA+0,old_velocity+0 ; movff old_velocity+3,WREG -; addwf divA+0,F ; add old speed +; addwf divA+0,F ; add old speed ; bcf STATUS,C -; rrcf divA+0,F ; /2 +; rrcf divA+0,F ; /2 ; movff old_velocity+2,WREG -; addwf divA+0,F ; add old speed +; addwf divA+0,F ; add old speed ; bcf STATUS,C -; rrcf divA+0,F ; /2 +; rrcf divA+0,F ; /2 ; movff old_velocity+1,WREG -; addwf divA+0,F ; add old speed +; addwf divA+0,F ; add old speed ; bcf STATUS,C -; rrcf divA+0,F ; /2 +; rrcf divA+0,F ; /2 ; movff old_velocity+0,WREG -; addwf divA+0,F ; add old speed +; addwf divA+0,F ; add old speed ; bcf STATUS,C -; rrcf divA+0,F ; /2 - goto TFT_display_velocity ; With divA+0 = m/min..., and return... +; rrcf divA+0,F ; /2 + goto TFT_display_velocity ; With divA+0 = m/min..., and return... ;============================================================================= @@ -558,6 +927,7 @@ btfsc decostop_active ; Is a deco stop displayed? bra delete_safety_stop ; Yes, don't show safety stop + ; Below "opt_safety_stop_reset"? Set flag and reset count-down timer SAFE_2BYTE_COPY rel_pressure, lo call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] @@ -567,7 +937,7 @@ mullw .10 ; mbar in PRODL:H movff PRODL,sub_b+0 movff PRODH,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b + call subU16 ; sub_c = sub_a - sub_b btfss neg_flag bra reset_safety_stop ; Below 10m, reset safety stop @@ -576,11 +946,11 @@ call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] movff lo,sub_a+0 movff hi,sub_a+1 - movff opt_safety_stop_end,WREG ; [cbar] + movff opt_safety_stop_end,WREG ; [cbar] mullw .10 ; mbar in PRODL:H movff PRODL,sub_b+0 movff PRODH,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b + call subU16 ; sub_c = sub_a - sub_b btfsc neg_flag bra delete_safety_stop ; Above 3m, remove safety stop @@ -614,7 +984,8 @@ btfss safety_stop_active ; Safety stop shown return ; No, don't delete it bcf safety_stop_active ; Clear flag - goto TFT_clear_safety_stop ; Clear safety stop, and return... + bsf FLAG_TFT_clear_safety_stop ; Clear safety stop + return ;============================================================================= @@ -633,21 +1004,24 @@ timeout_divemode_menu2: ; Called from divemenu_tree.asm bcf divemode_menu ; Timeout! Clear flag call TFT_clear_divemode_menu ; Clear menu - call TFT_active_gas_divemode ; Redraw gas/setpoint/diluent + bsf FLAG_TFT_active_gas_divemode; Redraw gas/setpoint/diluent bcf blinking_better_gas ; Clear flag to have temperature updated once - call TFT_temp_divemode ; Displays temperature + bsf FLAG_TFT_temp_divemode ; Displays temperature call TFT_draw_gassep_line ; Gas separator grid in spec mode only btfss decostop_active ; In deco mode ? bra timeout_divemode_menu_ndl ; No, show NDL again ; Show deco - call TFT_display_deko_mask ; clear nostop time, display decodata - call TFT_display_deko - goto TFT_show_TTS_divemode; and return... - -timeout_divemode_menu_ndl: ; Show NDL - call TFT_display_ndl_mask ; Clear deco data, display nostop time - goto TFT_display_ndl; and return... + bsf FLAG_TFT_display_deko_mask + bsf FLAG_TFT_display_deko + bsf FLAG_TFT_display_tts + return + +timeout_divemode_menu_ndl: + ; Show NDL + bsf FLAG_TFT_display_ndl_mask + bsf FLAG_TFT_display_ndl + return timeout_divemode: btfsc divemode_menu ; Divemode menu active? @@ -674,7 +1048,7 @@ movff opt_diveTimeout,WREG ; in [min] mullw .60 movff PRODL,sub_a+0 - movff PRODH,sub_a+1 ; in [s] + movff PRODH,sub_a+1 ; in [s] movff timeout_counter, sub_b+0 movff timeout_counter2, sub_b+1 @@ -705,17 +1079,6 @@ bsf divemode return -update_temp_and_or_depth: ; New sensor data arrived... - btfsc temp_changed - call TFT_temp_divemode ; Displays temperature - -; btfsc pressure_refresh - call TFT_depth ; Displays new depth - - rcall set_max_depth ; update max. depth if required - bcf pressure_refresh ; until new pressure is available - return - update_divemode60: ; update any minute call get_battery_voltage ; gets battery voltage rcall set_powersafe ; Battery low? @@ -745,7 +1108,8 @@ ; max_pressure<rel_pressure movff sub_b+0,max_pressure+0 movff sub_b+1,max_pressure+1 - goto TFT_max_pressure ; No, use normal max. depth; and return... + bsf FLAG_TFT_max_depth ; Set flag + return set_min_temp: movff minimum_temperature+0,sub_a+0 @@ -763,39 +1127,39 @@ global set_dive_modes set_dive_modes: - btfsc high_altitude_mode ; In high altitude (Fly) mode? - bra set_dive_modes3 ; Yes! + btfsc high_altitude_mode ; In high altitude (Fly) mode? + bra set_dive_modes3 ; Yes! set_dive_modes0: movlw LOW start_dive_threshold - movwf sub_a+0 ; dive_treshold is in cm + movwf sub_a+0 ; dive_treshold is in cm movlw HIGH start_dive_threshold - movwf sub_a+1 ; dive_treshold is in cm + movwf sub_a+1 ; dive_treshold is in cm set_dive_modes1: SAFE_2BYTE_COPY rel_pressure, sub_b - call subU16 ; sub_c = sub_a - sub_b + call subU16 ; sub_c = sub_a - sub_b btfss neg_flag - bra set_dive_modes2 ; too shallow (rel_pressure<dive_threshold) + bra set_dive_modes2 ; too shallow (rel_pressure<dive_threshold) - btfsc realdive ; Dive longer than one minute? - clrf timeout_counter ; Yes, reset timout counter + btfsc realdive ; Dive longer than one minute? + clrf timeout_counter ; Yes, reset timout counter - bsf divemode ; (Re-)Set divemode flag - bsf divemode2 ; displayed divetime is running + bsf divemode ; (Re-)Set divemode flag + bsf divemode2 ; displayed divetime is running return set_dive_modes2: - bcf divemode2 ; Stop time - btfss realdive ; dive longer then one minute? - bcf divemode ; no -> this was no real dive - return ; No, return + bcf divemode2 ; Stop time + btfss realdive ; dive longer then one minute? + bcf divemode ; no -> this was no real dive + return ; No, return -set_dive_modes3: ; High-altitude mode - btfsc realdive ; dive longer then one minute? - bra set_dive_modes0 ; Yes -> this is a real dive -> Use start_dive_threshold or ascend +set_dive_modes3: ; High-altitude mode + btfsc realdive ; dive longer then one minute? + bra set_dive_modes0 ; Yes -> this is a real dive -> Use start_dive_threshold or ascend movlw HIGH high_altitude_dive_threshold movwf sub_a+1 @@ -808,22 +1172,22 @@ cpfslt batt_percent return - movlw d'7' ; Type of Alarm (Battery Low) - movwf AlarmType ; Copy to Alarm Register - bsf event_occured ; Set Event Flag + movlw d'7' ; Type of Alarm (Battery Low) + movwf AlarmType ; Copy to Alarm Register + bsf event_occured ; Set Event Flag movlw .0 - movff WREG,opt_brightness ; Set Brightness to ECO - return ; return + movff WREG,opt_brightness ; Set Brightness to ECO + return ; return calc_average_depth: - btfsc reset_average_depth ; Reset the Average depth? - rcall reset_average1 ; Reset the resettable average depth + btfsc reset_average_depth ; Reset the Average depth? + rcall reset_average1 ; Reset the resettable average depth ; 1. Add new 2xdepth to the Sum of depths registers SAFE_2BYTE_COPY rel_pressure, xB ; Buffer... bcf STATUS,C rlcf xB+0,F - rlcf xB+1,F ; x2 + rlcf xB+1,F ; x2 movf xB+0,w addwf average_depth_hold+0,F @@ -831,9 +1195,9 @@ addwfc average_depth_hold+1,F movlw d'0' addwfc average_depth_hold+2,F - addwfc average_depth_hold+3,F ; Will work up to 9999mbar*60*60*24=863913600mbar + addwfc average_depth_hold+3,F ; Will work up to 9999mbar*60*60*24=863913600mbar -; Do the same for the _total registers (Non-Resettable) + ; Do the same for the _total registers (Non-Resettable) movf xB+0,w addwf average_depth_hold_total+0,F movf xB+1,w @@ -850,7 +1214,7 @@ movff average_depth_hold+2,xC+2 movff average_depth_hold+3,xC+3 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder movff xC+0,avg_rel_pressure+0 movff xC+1,avg_rel_pressure+1 @@ -864,7 +1228,7 @@ movff average_depth_hold_total+1,xC+1 movff average_depth_hold_total+2,xC+2 movff average_depth_hold_total+3,xC+3 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder movff xC+0,avg_rel_pressure_total+0 movff xC+1,avg_rel_pressure_total+1 return @@ -880,11 +1244,12 @@ bcf reset_average_depth ; Clear flag return -test_switches_divemode: ; checks switches in divemode +test_switches_divemode: ; checks switches in divemode btfsc divemode_menu ; Divemode menu shown? bra test_switches_divemode_menu ; Yes, use menu processor btfsc switch_left - goto menuview_toggle ; Menu or Simulator tasks; and return...; bra test_switches_divemode2 ; Enter button pressed, check if we need to do something + ; bra test_switches_divemode2 ; Enter button pressed, check if we need to do something + goto menuview_toggle ; Menu or Simulator tasks; and return... btfss switch_right return ; No button press tstfsz menupos2 ; any option shown? @@ -914,7 +1279,7 @@ test_switches_divemode_menu3: ; Enter submenu or do something bcf switch_right -; decf menupos,F ; menu_processor needs 0-5... +; decf menupos,F ; menu_processor needs 0-5... extern do_line_menu goto do_line_menu ; Warning! Trashes STKPTR and returns to diveloop_loop4: @@ -941,103 +1306,281 @@ bra divemode_option6 ; +5mins simulation dcfsnz WREG,F bra divemode_option7 ; Store heading + dcfsnz WREG,F + bra divemode_option8 ; Switch to alt. layout return gas_switched_common: - bcf divemode_gaschange ; Clear flag - - tstfsz menupos ; menupos=0? - bra $+4 ; No - return ; Yes, do not switch gas (There is no Gas #0 !) + bcf divemode_gaschange ; Clear flag + tstfsz menupos ; menupos=0? + bra gas_switched_common1 ; No + return ; Yes, do not switch gas (there is no Gas #0 !) +gas_switched_common1: + movf menupos,W ; get selected gas into WREG (1-6) - decf menupos,W ; 1-5 -> 0-4 - btfsc FLAG_ccr_mode ; Choose CC Diluents - rcall setup_dil_registers ; With WREG=Gas 0-4 - decf menupos,W ; 1-5 -> 0-4 - btfsc FLAG_pscr_mode ; Choose CC Diluents - rcall setup_dil_registers ; With WREG=Gas 0-4 - ; OC mode? - btfsc FLAG_ccr_mode ; CCR? - bra gas_switched_common2 ; Yes - btfsc FLAG_pscr_mode ; PSCR? - bra gas_switched_common2 ; Yes - ; -> OC - decf menupos,W ; 1-5 -> 0-4 - rcall setup_gas_registers ; With WREG=Gas 0-4 + btfsc FLAG_ccr_mode ; in CCR mode? + bra gas_switched_common2 ; YES - configure diluent or bailout + btfsc FLAG_pscr_mode ; in pSCR mode? + bra gas_switched_common2 ; YES - configure diluent or bailout + + ; OC + rcall setup_gas_registers ; With WREG = Gas 1-6 + rcall deco_setup_oc_gases ; With WREG = Gas 1-6 + bra gas_switched_common3 + + ; Loop or Bailout gas_switched_common2: - decf menupos,W ; 1-5 -> 0-4 - btfsc is_bailout ; Choose OC Bailouts (OC Gases) - rcall setup_gas_registers ; With WREG=Gas 0-4 - - movlw .0 - btfsc is_bailout - movff WREG,char_I_const_ppO2 ; deactivate CCR-mode deco calc - - call TFT_active_gas_divemode ; Display gas/Setpoint - clrf WREG - movff WREG,char_O_deco_status ; Restart decoplan computation + rcall setup_dil_registers ; With WREG = diluent 1-6, in case of is_bailout reverts to OC gases + rcall deco_setup_cc_diluents ; With WREG = diluent 1-6, in case of is_bailout reverts to OC gases + +gas_switched_common3: + bsf FLAG_TFT_active_gas_divemode ; Redraw gas/setpoint/diluent + call restart_deco_engine_wo_ceiling ; abort any running deco calculations and restart the deco engine ; Set flags for profile recording - bsf event_occured ; Set global event byte - btfsc is_bailout ; Choose OC Bailouts (OC Gases) - bsf bailoutgas_event ; Bailout gas change - btfss is_bailout ; Choose OC Bailouts (OC Gases) - bsf stored_gas_changed ; OC gas change + bsf event_occured ; Set global event byte + btfsc is_bailout ; Choose OC Bailouts (OC Gases) + bsf bailoutgas_event ; Bailout gas change + btfss is_bailout ; Choose OC Bailouts (OC Gases) + bsf stored_gas_changed ; OC gas change return - global setup_gas_registers -setup_gas_registers: ; With WREG=Gas 0-4 - lfsr FSR1,opt_gas_O2_ratio+0 - movff PLUSW1,char_I_O2_ratio ; O2 (For ppO2 calculations) - lfsr FSR1,opt_gas_He_ratio+0 - movff PLUSW1,char_I_He_ratio ; He - lfsr FSR1,opt_gas_type - movff PLUSW1,active_gas_type ; 0=Disabled, 1=First, 2=Travel, 3=Deco for OC gases and 0=Disabled, 1=First, 2=Normal for diluents - incf WREG,W ; Gas# 1-5 - movff WREG,char_I_current_gas ; Set gas - movff WREG,active_gas ; Set for logbook and display - banksel char_I_O2_ratio - movf char_I_O2_ratio,W ; Add O2... - addwf char_I_He_ratio,W ; ...and He... - sublw .100 ; ...subtract both from 100 - movwf char_I_N2_ratio ; -> N2! - banksel common - return + +; Code to pass all parameters to the C code + + global get_first_gas_to_WREG +get_first_gas_to_WREG: ; Gets first gas (1-5) into WREG + lfsr FSR1,opt_gas_type ; Point to gas types + clrf lo ; start with Gas0 +get_first_gas_to_WREG2: + movf lo,W + movf PLUSW1,W ; Get Type of Gas #lo + sublw .1 ; it is = 1 (First Gas) + bz get_first_gas_to_WREG3 ; Found the first gas! + incf lo,F ; ++ + movlw NUM_GAS+1 + cpfseq lo ; All done? + bra get_first_gas_to_WREG2 ; Not yet + ; No first gas found, use #1 + movlw .0 + movff WREG,opt_gas_type+0 ; Set Gas1 to First + incf WREG,W ; 0 -> 1 + return +get_first_gas_to_WREG3: + movf lo,W ; Put into Wreg + incf WREG,W ; 0-4 -> 1-5 + return ; Done + + global get_first_dil_to_WREG +get_first_dil_to_WREG: ; Gets first dil (1-5) into WREG + lfsr FSR1,opt_dil_type ; Point to dil types + clrf lo ; start with Gas0 +get_first_dil_to_WREG2: + movf lo,W + movf PLUSW1,W ; Get Type of Dil #lo + sublw .1 ; it is = 1 (First Dil) + bz get_first_dil_to_WREG3 ; Found the first dil! + incf lo,F ; ++ + movlw NUM_GAS+1 + cpfseq lo ; All done? + bra get_first_dil_to_WREG2 ; Not yet + ; No first dil found, use #1 + movlw .0 + movff WREG,opt_dil_type+0 ; Set Dil1 to First + incf WREG,W ; 0 -> 1 + return +get_first_dil_to_WREG3: + movf lo,W ; Put into Wreg + incf WREG,W ; 0-4 -> 1-5 + return ; Done + + global deco_setup_oc_gases +deco_setup_oc_gases: ; with currently breathed gas in WREG (1-5 or 6) + movff WREG,char_I_current_gas ; gas to start with when doing the deco calculations + + movff opt_gas_He_ratio+0,char_I_deco_He_ratio+0 + movff opt_gas_O2_ratio+0,char_I_deco_O2_ratio+0 + banksel opt_gas_type+0 + movlw .3 ; 3=Deco + cpfseq opt_gas_type+0 ; Gas is deco type? + clrf opt_OC_bail_gas_change+0 ; No, clear depth for 0=Disabled, 1=First and 2=Travel + banksel common + + movff opt_gas_He_ratio+1,char_I_deco_He_ratio+1 + movff opt_gas_O2_ratio+1,char_I_deco_O2_ratio+1 + banksel opt_gas_type+1 + movlw .3 ; 3=Deco + cpfseq opt_gas_type+1 ; Gas is deco type? + clrf opt_OC_bail_gas_change+1 ; No, clear depth for 0=Disabled, 1=First and 2=Travel + banksel common + + movff opt_gas_He_ratio+2,char_I_deco_He_ratio+2 + movff opt_gas_O2_ratio+2,char_I_deco_O2_ratio+2 + banksel opt_gas_type+2 + movlw .3 ; 3=Deco + cpfseq opt_gas_type+2 ; Gas is deco type? + clrf opt_OC_bail_gas_change+2 ; No, clear depth for 0=Disabled, 1=First and 2=Travel + banksel common + + movff opt_gas_He_ratio+3,char_I_deco_He_ratio+3 + movff opt_gas_O2_ratio+3,char_I_deco_O2_ratio+3 + banksel opt_gas_type+3 + movlw .3 ; 3=Deco + cpfseq opt_gas_type+3 ; Gas is deco type? + clrf opt_OC_bail_gas_change+3 ; No, clear depth for 0=Disabled, 1=First and 2=Travel + banksel common + + movff opt_gas_He_ratio+4,char_I_deco_He_ratio+4 + movff opt_gas_O2_ratio+4,char_I_deco_O2_ratio+4 + banksel opt_gas_type+4 + movlw .3 ; 3=Deco + cpfseq opt_gas_type+4 ; Gas is deco type? + clrf opt_OC_bail_gas_change+4 ; No, clear depth for 0=Disabled, 1=First and 2=Travel + banksel common + + ; Setup char_I_deco_gas_change array + movff opt_OC_bail_gas_change+0, char_I_deco_gas_change+0 + movff opt_OC_bail_gas_change+1, char_I_deco_gas_change+1 + movff opt_OC_bail_gas_change+2, char_I_deco_gas_change+2 + movff opt_OC_bail_gas_change+3, char_I_deco_gas_change+3 + movff opt_OC_bail_gas_change+4, char_I_deco_gas_change+4 + + ; switch to oc mode + movff char_O_deco_status,lo ; working copy of char_O_deco_status in bank common + bcf lo,DECO_MODE_PSCR_FLAG ; clear the pSCR-mode flag (may not be set, but never mind) + bcf lo,DECO_MODE_LOOP_FLAG ; clear the loop/CCR-mode flag + movff lo,char_O_deco_status ; bank safe write-back of char_O_deco_status + + return + + + global deco_setup_cc_diluents +deco_setup_cc_diluents: ; with currently breathed gas in WREG (1-5 or 6) + btfsc is_bailout ; check if in bailout condition + bra deco_setup_oc_gases ; revert to setting up OC gases in bailout condition + + movff WREG,char_I_current_gas ; gas to start with when doing the deco calculations - global setup_dil_registers -setup_dil_registers: ; With WREG=dil 0-4 - btfsc is_bailout - return ; Ignore in bailout - lfsr FSR1,opt_dil_O2_ratio+0 - movff PLUSW1,char_I_O2_ratio ; O2 (For ppO2 calculations) - lfsr FSR1,opt_dil_He_ratio+0 - movff PLUSW1,char_I_He_ratio ; He - lfsr FSR1,opt_dil_type - movff PLUSW1,active_gas_type ; 0=Disabled, 1=First, 2=Travel, 3=Deco for OC gases and 0=Disabled, 1=First, 2=Normal for diluents - incf WREG,W ; Gas# 1-5 - movff WREG,char_I_current_gas ; Set gas - movff WREG,active_gas ; Set for logbook and display - movff WREG,active_diluent ; As a backup when switching back from Bailout to CCR - banksel char_I_O2_ratio - movf char_I_O2_ratio,W ; Add O2... - addwf char_I_He_ratio,W ; ...and He... - sublw .100 ; ...subtract both from 100 - movwf char_I_N2_ratio ; -> N2! - banksel common - return + movff opt_dil_He_ratio+0,char_I_deco_He_ratio+0 + movff opt_dil_O2_ratio+0,char_I_deco_O2_ratio+0 + movff opt_dil_type+0,WREG ; 0=Disabled, 1=First, 2=Normal + tstfsz WREG ; Disabled? + bra $+4 ; No + movff WREG,char_I_dil_change+0 ; Yes, clear char_I_deco_gas_change (Bank safe) + + movff opt_dil_He_ratio+1,char_I_deco_He_ratio+1 + movff opt_dil_O2_ratio+1,char_I_deco_O2_ratio+1 + movff opt_dil_type+1,WREG ; 0=Disabled, 1=First, 2=Normal + tstfsz WREG ; Disabled? + bra $+4 ; No + movff WREG,char_I_dil_change+1 ; Yes, clear char_I_dil_change + + movff opt_dil_He_ratio+2,char_I_deco_He_ratio+2 + movff opt_dil_O2_ratio+2,char_I_deco_O2_ratio+2 + movff opt_dil_type+2,WREG ; 0=Disabled, 1=First, 2=Normal + tstfsz WREG ; Disabled? + bra $+4 ; No + movff WREG,char_I_dil_change+2 ; Yes, clear char_I_dil_change + + movff opt_dil_He_ratio+3,char_I_deco_He_ratio+3 + movff opt_dil_O2_ratio+3,char_I_deco_O2_ratio+3 + movff opt_dil_type+3,WREG ; 0=Disabled, 1=First, 2=Normal + tstfsz WREG ; Disabled? + bra $+4 ; No + movff WREG,char_I_dil_change+3 ; Yes, clear char_I_dil_change + + movff opt_dil_He_ratio+4,char_I_deco_He_ratio+4 + movff opt_dil_O2_ratio+4,char_I_deco_O2_ratio+4 + movff opt_dil_type+4,WREG ; 0=Disabled, 1=First, 2=Normal + tstfsz WREG ; Disabled? + bra $+4 ; No + movff WREG,char_I_dil_change+4 ; Yes, clear char_I_dil_change + + ; Setup char_I_deco_gas_change array + movff char_I_dil_change+0, char_I_deco_gas_change+0 + movff char_I_dil_change+1, char_I_deco_gas_change+1 + movff char_I_dil_change+2, char_I_deco_gas_change+2 + movff char_I_dil_change+3, char_I_deco_gas_change+3 + movff char_I_dil_change+4, char_I_deco_gas_change+4 + + ; switch to CCR / pSCR mode + movff char_O_deco_status,lo ; working copy of char_O_deco_status in bank common + bsf lo,DECO_MODE_LOOP_FLAG ; loop flag is set in both, CCR and pSCR mode + bcf lo,DECO_MODE_PSCR_FLAG ; clear pSCR mode flag by default + btfsc FLAG_pscr_mode ; check if we are in pSCR mode + bsf lo,DECO_MODE_PSCR_FLAG ; YES - set additional flag for pSCR mode + movff lo,char_O_deco_status ; bank safe write-back of char_O_deco_status + + return -divemode_option_gaschange: ; Switch to the better gas - movff better_gas_number,menupos; 1-5 - bsf divemode_gaschange ; Change the gas in the dive mode loop... - call menuview_toggle_reset ; Reset to zero (Zero=no menuview) - bcf better_gas_available ; Clear flag immediately - return + global setup_gas_registers +setup_gas_registers: ; with currently breathed gas in WREG (1-5 or 6) + movwf active_gas ; set as current gas + movlw .6 + cpfseq active_gas ; gas = gas6 ? + bra setup_gas_registers_15 ; NO - load gas 1-5 + movff gas6_O2_ratio,char_I_O2_ratio ; copy gas6 O2 ratio to deco engine + movff gas6_He_ratio,char_I_He_ratio ; copy gas6 H2 ratio to deco engine + bra setup_gas_registers_com ; continue with common part +setup_gas_registers_15: + decf active_gas,W ; 1-5 -> 0-4 + lfsr FSR1,opt_gas_O2_ratio+0 + movff PLUSW1,char_I_O2_ratio ; copy gas 1-5 O2 ratio to deco engine + lfsr FSR1,opt_gas_He_ratio+0 + movff PLUSW1,char_I_He_ratio ; copy gas 1-5 He ratio to deco engine +setup_gas_registers_com: + ;lfsr FSR1,opt_gas_type ; commented out - currently not used anywhere + ;movff PLUSW1,active_gas_type ; 0=Disabled, 1=First, 2=Travel, 3=Deco + movff char_O_main_status,lo ; working copy of char_O_main_status in bank common + bcf lo,DECO_MODE_PSCR_FLAG ; clear the pSCR-mode flag (may not be set, but never mind) + bcf lo,DECO_MODE_LOOP_FLAG ; clear the loop/CCR-mode flag + movff lo,char_O_main_status ; bank safe write-back of char_O_main_status + movf active_gas,W ; reload WREG with diluent 1-5 or 6 (important!) + return -divemode_option0: ; Start/Setup Divemode menu - call TFT_clear_divemode_menu ; Clear menu area - bcf menuview - extern do_main_divemenu - call do_main_divemenu + global setup_dil_registers +setup_dil_registers: ; with currently breathed gas in WREG (1-5 or 6) + btfsc is_bailout ; check if in bailout condition + bra setup_gas_registers ; revert to setting up OC gases in bailout condition + movwf active_gas ; set as current gas + movff WREG,active_diluent ; remember for when switching back from bailout to loop + movlw .6 + cpfseq active_gas ; diluent = gas6 ? + bra setup_dil_registers_15 ; NO - load diluent 1-5 + movff gas6_O2_ratio,char_I_O2_ratio ; copy gas6 O2 ratio to deco engine + movff gas6_He_ratio,char_I_He_ratio ; copy gas6 H2 ratio to deco engine + bra setup_dil_registers_com ; continue with common part +setup_dil_registers_15: + decf active_gas,W ; 1-5 -> 0-4 + lfsr FSR1,opt_dil_O2_ratio+0 + movff PLUSW1,char_I_O2_ratio ; copy diluent 1-5 O2 ratio to deco engine + lfsr FSR1,opt_dil_He_ratio+0 + movff PLUSW1,char_I_He_ratio ; copy diluent 1-5 He ratio to deco engine +setup_dil_registers_com: + ;lfsr FSR1,opt_dil_type ; commented out - currently not used anywhere + ;movff PLUSW1,active_gas_type ; 0=Disabled, 1=First, 2=Normal (there is no type 3 for diluents) + movff char_O_main_status,lo ; working copy of char_O_main_status in bank common + bsf lo,DECO_MODE_LOOP_FLAG ; loop flag is set in both, CCR and pSCR mode + bcf lo,DECO_MODE_PSCR_FLAG ; clear pSCR mode flag by default + btfsc FLAG_pscr_mode ; check if we are in pSCR mode + bsf lo,DECO_MODE_PSCR_FLAG ; YES - set additional flag for pSCR mode + movff lo,char_O_main_status ; bank safe write-back of char_O_main_status + movf active_gas,W ; reload WREG with diluent 1-5 or 6 (important!) + return + +divemode_option_gaschange: ; Switch to the better gas + movff better_gas_number,menupos ; 1-5 + bsf divemode_gaschange ; Change the gas in the dive mode loop... + call menuview_toggle_reset ; Reset to zero (Zero=no menuview) + bcf better_gas_available ; Clear flag immediately + return + +divemode_option0: ; Start/Setup Divemode menu + call TFT_clear_divemode_menu ; Clear menu area + bcf menuview + extern do_main_divemenu + call do_main_divemenu + global divemode_option0_return divemode_option0_return: ; movlw .1 @@ -1047,7 +1590,7 @@ movwf timeout_counter3 ; timeout for divemode menu bsf divemode_menu ; Set flag clrf menupos2 ; Clear option counter - bra diveloop_loop4 ; Goto back to diveloop (Menuprocessor trashes STKPTR!) + goto diveloop_loop4 ; Goto back to diveloop (Menuprocessor trashes STKPTR!) divemode_option4: movlw d'58' ; two seconds left @@ -1056,7 +1599,7 @@ movwf apnoe_timeout_counter btfss simulatormode_active ; in simulator mode? return ; No -divemode_option1: ; Quit simulation mode +divemode_option1: ; Quit simulation mode banksel isr_backup movlw low .1000 movwf sim_pressure+0 @@ -1073,7 +1616,7 @@ movwf apnoe_timeout_counter return -divemode_option3: ; minus 1m +divemode_option3: ; minus 1m banksel isr_backup movlw d'100' subwf sim_pressure+0 @@ -1083,7 +1626,7 @@ banksel common return -divemode_option2: ; plus 1m +divemode_option2: ; plus 1m banksel isr_backup movlw d'100' addwf sim_pressure+0 @@ -1112,13 +1655,14 @@ addwf total_divetime_seconds+0,F movlw HIGH (.5*.60) addwfc total_divetime_seconds+1,F ; Add 5*60 seconds -; 1. Add 300xdepth to the Sum of depths registers + + ; 1. Add 300xdepth to the Sum of depths registers SAFE_2BYTE_COPY rel_pressure, xB ; Buffer... movlw LOW (.5*.60) movwf xA+0 movlw HIGH (.5*.60) movwf xA+1 - call mult16x16 ;xA*xB=xC + call mult16x16 ; xA*xB=xC movf xC+0,w addwf average_depth_hold+0,F @@ -1127,32 +1671,23 @@ movf xC+2,w addwfc average_depth_hold+2,F movf xC+3,w - addwfc average_depth_hold+3,F ; Will work up to 9999mbar*60*60*24=863913600mbar + addwfc average_depth_hold+3,F ; Will work up to 9999mbar*60*60*24=863913600mbar -; Do the same for the _total registers (Non-Resettable) + ; Do the same for the _total registers (Non-Resettable) movf xC+0,w addwf average_depth_hold_total+0,F movf xC+1,w addwfc average_depth_hold_total+1,F movf xC+2,w addwfc average_depth_hold_total+2,F - movf xC+3,w - addwfc average_depth_hold_total+3,F ; Will work up to 9999mbar*60*60*24=863913600mbar + movf xC+3,w + addwfc average_depth_hold_total+3,F; Will work up to 9999mbar*60*60*24=863913600mbar - movlw .5 - movwf up ; counter -; 1min mode -divemode_option6_2: - movlw .1 - movff WREG,char_I_step_is_1min ; Force 1min mode - clrf TMR5L - clrf TMR5H ; 30,51757813µs/bit in TMR5L:TMR5H - call deco_calc_hauptroutine ; calc_tissue - movlb .1 - decfsz up,F ; Done? - bra divemode_option6_2 ; Not yet - bsf divemode2 ; continue divetime - goto menuview_toggle_reset ; and return... + movlw .5 ; + 5 minutes + movff WREG,char_I_sim_advance_time; copy to mailbox + bsf divemode2 ; continue divetime + call restart_deco_engine + goto menuview_toggle_reset ; and return... divemode_option7: ; Store heading for compass view @@ -1160,6 +1695,14 @@ movff compass_heading_shown+1,compass_bearing+1 bsf compass_bearing_set ; set flag goto menuview_toggle_reset ; Done and return... + +divemode_option8: + bsf alternative_divelayout ; Set flag for mode + bsf FLAG_TFT_divemode_mask_alt ; Set flag for mask + movlw .1 + movwf menupos3 ; For the customviews... + call TFT_ClearScreen ; Clear screen + goto menuview_toggle_reset ; Done and return... divemode_simulator_check_limits: ; Check limits (150m and 0m) @@ -1237,12 +1780,14 @@ movlw .4 rcall check_gas_common ; With Gas 0-4 in WREG ; bra check_gas_change_exit + check_gas_change_exit: - btfss better_gas_available ; Is a better gas available - bcf blinking_better_gas ; No, Clear blinking flag - btfss better_gas_available ; Is a better gas available + btfss better_gas_available ; Is a better gas available + bcf blinking_better_gas ; No, Clear blinking flag + btfss better_gas_available ; Is a better gas available clrf better_gas_number ; No, Clear better_gas_number (For gaslist display) - goto TFT_active_gas_divemode ; Display gas/Setpoint and return... + bsf FLAG_TFT_active_gas_divemode; Redraw gas/setpoint/diluent + return check_gas_common: ; With Gas 0-4 in WREG btfsc better_gas_available ; Better Gas already found? @@ -1253,7 +1798,7 @@ btfss PLUSW1,1 ; Test for Bit0 and 1 -> type=3 -> Deco return ; No incf WREG,W ; 1-5 - cpfseq active_gas ; is this gas currently selected? + cpfseq active_gas ; is this gas current gas? bra check_gas_common2 ; No return ; Yes, skip test for active gas check_gas_common2: @@ -1272,7 +1817,7 @@ movlw better_gas_window_neg subwf lo,W ; Change depth-better_gas_window_neg cpfslt xC+0 ; current depth<Change depth-better_gas_window_neg? - bra check_gas_common4 ; Ok, now check the better gas ppO2<opt_ppO2_max + bra check_gas_common4 ; Ok, now check the better gas ppO2<char_I_ppO2_max return check_gas_common3: @@ -1281,20 +1826,13 @@ movlw better_gas_window_pos addwf lo,W ; Change depth+better_gas_window_pos cpfsgt xC+0 ; current depth>Change depth+better_gas_window_pos? - bra check_gas_common4 ; Ok, now check the better gas ppO2<opt_ppO2_max + bra check_gas_common4 ; Ok, now check the better gas ppO2<char_I_ppO2_max return check_gas_common4: - movf hi,W ; 0-4 - lfsr FSR1,char_I_deco_N2_ratio - movff PLUSW1,lo ; N2 ratio into lo - lfsr FSR1,char_I_deco_He_ratio - movff PLUSW1,xB+0 ; He ratio into xB+0 - movf xB+0,W - addwf lo,F - movlw .101 - bcf STATUS,C - subfwb lo,F ; O2 ratio in lo + movf hi,W ; gas 0-4 into WREG + lfsr FSR1,char_I_deco_O2_ratio ; load base address char_I_deco_O2_ratio array + movff PLUSW1,lo ; read O2 ratio from array into lo SAFE_2BYTE_COPY amb_pressure, xA movlw d'10' @@ -1308,35 +1846,35 @@ call mult16x16 ; lo * p_amb/10 ; Check very high ppO2 manually - tstfsz xC+2 ; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar? - return ; Done. + tstfsz xC+2 ; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar? + return ; Done. ; Check if ppO2>3,30bar btfsc xC+1,7 - return ; Done. + return ; Done. ; Check for low ppo2 movff xC+0,sub_b+0 movff xC+1,sub_b+1 - movff opt_ppO2_min,WREG - mullw d'100' ; opt_ppO2_min*100 + movff char_I_ppO2_min,WREG + mullw d'100' ; char_I_ppO2_min*100 movff PRODL,sub_a+0 movff PRODH,sub_a+1 - call subU16 ; sub_c = sub_a - sub_b + call subU16 ; sub_c = sub_a - sub_b btfss neg_flag - return ; Done (Too low). + return ; Done (Too low). -;check if we are within our warning thresholds! + ;check if we are within our warning thresholds! movff xC+0,sub_a+0 movff xC+1,sub_a+1 - movff opt_ppO2_max_deco,WREG ; PPO2 Max for MOD calculation and color coding in divemode - addlw .1 ; e.g. >1.60 - mullw d'100' ; opt_ppO2_max*100 + movff char_I_ppO2_max_deco,WREG ; ppO2 max for MOD calculation and color coding in divemode + addlw .1 ; e.g. >1.60 + mullw d'100' ; char_I_ppO2_max*100 movff PRODL,sub_b+0 movff PRODH,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b + call subU16 ; sub_c = sub_a - sub_b btfsc neg_flag bsf better_gas_available ;=1: A better gas is available and a gas change is advised in divemode - return ; Done. + return ; Done. check_dil_common: ; With Dil 0-4 in WREG btfsc better_gas_available ; Better Diluent already found? @@ -1347,7 +1885,7 @@ return ; Yes, skip inactive diluents for test check_dil_common1: incf WREG,W ; 1-5 - cpfseq active_gas ; is this diluent currently selected? + cpfseq active_gas ; is this the current diluent? bra check_dil_common2 ; No return ; Yes, skip test for active diluent check_dil_common2: @@ -1373,11 +1911,11 @@ ;============================================================================= ; Check for Auto-SP ; -check_dive_autosp: ; Check for Auto-SP - movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP - sublw .2 ; opt_ccr_mode = 2 (Auto SP)? - bz check_dive_autosp2 ; Yes, check - return ; No, return for Sensor or Fixed mode +check_dive_autosp: ; Check for Auto-SP + movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP + sublw .2 ; opt_ccr_mode = 2 (Auto SP)? + bz check_dive_autosp2 ; Yes, check + return ; No, return for Sensor or Fixed mode check_dive_autosp2: SAFE_2BYTE_COPY rel_pressure,xA movlw d'100' @@ -1385,17 +1923,18 @@ clrf xB+1 call div16x16 ; compute depth in full m -> result in xC+0 ; Check SP2 - btfsc sp2_switched ;=1: This setpoint has been autoselected already + btfsc sp2_switched ; =1: This setpoint has been autoselected already bra check_dive_autosp3 ; Skip check movff char_I_setpoint_change+1,lo ; Get depth in m tstfsz lo ; =0? - bra $+4 ; No, continue + bra check_dive_autosp2a ; No, continue bra check_dive_autosp3 ; Skip check +check_dive_autosp2a: decf lo,W ; -1 -> WREG cpfsgt xC+0 ; Compare with depth bra check_dive_autosp3 ; lower depth, do not switch ; auto switch to SP2 - movff char_I_setpoint_cbar+1, char_I_const_ppO2 ; Use SetPoint + movff char_I_setpoint_cbar+1,char_I_const_ppO2 ; Use SetPoint rcall xmit_sp_set_flag bsf sp2_switched ; Set flag check_dive_autosp3: @@ -1404,13 +1943,14 @@ bra check_dive_autosp4 ; Skip check movff char_I_setpoint_change+2,lo ; Get depth in m tstfsz lo ; =0? - bra $+4 ; No, continue + bra check_dive_autosp3a ; No, continue bra check_dive_autosp4 ; Skip check +check_dive_autosp3a: decf lo,W ; -1 -> WREG cpfsgt xC+0 ; Compare with depth bra check_dive_autosp4 ; lower depth, do not switch ; auto switch to SP3 - movff char_I_setpoint_cbar+2, char_I_const_ppO2 ; Use SetPoint + movff char_I_setpoint_cbar+2,char_I_const_ppO2 ; Use SetPoint rcall xmit_sp_set_flag bsf sp3_switched ; Set flag check_dive_autosp4: @@ -1419,13 +1959,14 @@ bra check_dive_autosp5 ; Skip check movff char_I_setpoint_change+3,lo ; Get depth in m tstfsz lo ; =0? - bra $+4 ; No, continue + bra check_dive_autosp4a ; No, continue bra check_dive_autosp5 ; Skip check +check_dive_autosp4a: decf lo,W ; -1 -> WREG cpfsgt xC+0 ; Compare with depth bra check_dive_autosp5 ; lower depth, do not switch ; auto switch to SP4 - movff char_I_setpoint_cbar+3, char_I_const_ppO2 ; Use SetPoint + movff char_I_setpoint_cbar+3,char_I_const_ppO2 ; Use SetPoint rcall xmit_sp_set_flag bsf sp4_switched ; Set flag check_dive_autosp5: @@ -1434,13 +1975,14 @@ bra check_dive_autosp6 ; Skip check movff char_I_setpoint_change+4,lo ; Get depth in m tstfsz lo ; =0? - bra $+4 ; No, continue + bra check_dive_autosp5a ; No, continue bra check_dive_autosp6 ; Skip check +check_dive_autosp5a: decf lo,W ; -1 -> WREG cpfsgt xC+0 ; Compare with depth bra check_dive_autosp6 ; lower depth, do not switch ; auto switch to SP5 - movff char_I_setpoint_cbar+4, char_I_const_ppO2 ; Use SetPoint + movff char_I_setpoint_cbar+4,char_I_const_ppO2 ; Use SetPoint rcall xmit_sp_set_flag bsf sp5_switched ; Set flag check_dive_autosp6: @@ -1448,7 +1990,7 @@ xmit_sp_set_flag: movff char_I_const_ppO2,WREG - call transmit_setpoint ; Transmit current setpoint from WREG (in cbar) to external electronics + call transmit_setpoint ; Transmit current setpoint from WREG (in cbar) to external electronics bsf setpoint_changed ; Set flag (For profile) bsf event_occured ; Set global event byte return @@ -1457,54 +1999,58 @@ ; Setup everything to enter divemode. ; dive_boot_oc: - extern get_first_gas_to_WREG - call get_first_gas_to_WREG ; Gets first gas (0-4) into WREG - incf WREG - movff WREG,char_I_first_gas ; Copy for compatibility (1-5) - decf WREG,W ; decrement WREG to old value again - rcall setup_gas_registers ; With WREG=Gas 0-4 - movlw .0 - movff WREG,char_I_const_ppO2 ; deactivate CCR-mode deco calc + rcall get_first_gas_to_WREG ; Gets first gas (1-5) into WREG + rcall setup_gas_registers ; set-up of gas parameters of currently breathed gas (with WREG = gas 1-5) + rcall deco_setup_oc_gases ; set-up of gas list for deco calculations (with WREG = gas 1-5) return dive_boot_cc: bcf is_bailout ; =1: Bailout bcf setpoint_fallback ; =1: Fallback to SP1 due to external O2 sensor failure - bcf blinking_setpoint ; Reset blinking SP flag - ; load default setpoint - movff char_I_setpoint_cbar+0,char_I_const_ppO2 ; Always start with SP1 - movff char_I_const_ppO2,WREG + bcf blinking_setpoint ; Reset blinking SP flag - call transmit_setpoint ; Transmit current setpoint from WREG (in cbar) to external electronics + ; revoke sensors from usage if they do not have a valid calibration + bsf use_O2_sensor1 + bsf use_O2_sensor2 + bsf use_O2_sensor3 + btfss sensor1_calibrated_ok + bcf use_O2_sensor1 + btfss sensor2_calibrated_ok + bcf use_O2_sensor2 + btfss sensor3_calibrated_ok + bcf use_O2_sensor3 - ; check if in sensor mode - movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP - sublw .1 ; opt_ccr_mode = 1 (Sensor)? - bnz dive_boot_cc2 ; No, Skip + ; In pSCR mode, only settings 0 (calculated ppO2) and 1 (ppO2 from sensors) are defined. + ; In case we still have 3 (auto SP) selected out of previous ccr mode, we reset to 0. + btfss FLAG_pscr_mode + bra dive_boot_cc_1 + movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP + sublw .2 ; opt_ccr_mode = 1 (Auto SP)? + bnz dive_boot_cc_1 + movlw .0 + movff WREG,opt_ccr_mode - ; get initial setpoint from all sensors in use - call compute_ppo2 ; compute mv_sensorX and ppo2_sensorX arrays - bsf voting_logic_sensor1 ; voting logic not used while computing initial setpoint - bsf voting_logic_sensor2 - bsf voting_logic_sensor3 - call divemode_setup_sensor_values ; setup sensor values - tstfsz sensor_setpoint ; if no sensor is in use, sensor_setpoint will be zero - movff sensor_setpoint,char_I_const_ppO2; overwrite default only if we have a valid sensor_setpoint - -dive_boot_cc2: +dive_boot_cc_1: bsf setpoint_changed ; Set flag (For profile) bcf sp2_switched ; =1: This setpoint has been autoselected already bcf sp3_switched ; =1: This setpoint has been autoselected already bcf sp4_switched ; =1: This setpoint has been autoselected already bcf sp5_switched ; =1: This setpoint has been autoselected already - extern get_first_dil_to_WREG - call get_first_dil_to_WREG ; Gets first gas (0-4) into WREG - incf WREG - movff WREG,char_I_first_gas ; Copy for compatibility - decf WREG,W - rcall setup_dil_registers ; With WREG=Gas 0-4 - goto calc_deko_divemode_sensor ; External sensor stuff (and return!) + rcall get_first_dil_to_WREG ; get first gas (1-5) into WREG + rcall setup_dil_registers ; set-up of gas parameters for currently breathed gas (with WREG = current gas 1-5) + rcall deco_setup_cc_diluents ; set-up of gas list for deco calculations (with WREG = current gas 1-5) + + ; Start with SP1 (CCR) or 0 (pSCR) as default. + ; If in sensor mode, this value will be overwritten by calc_deko_divemode_sensor + clrf WREG ; preload WREG with setpoint value 0 for pSCR calculated + btfss FLAG_ccr_mode ; are we in CCR mode? + bra dive_boot_cc_2 ; NO - keep preloaded value + movff char_I_setpoint_cbar+0,WREG ; YES - get value of setpoint 1 +dive_boot_cc_2: + movff WREG,char_I_const_ppO2 ; write setpoint to deco engine + call transmit_setpoint ; transmit current setpoint from WREG (in cbar) to external electronics + goto calc_deko_divemode_sensor ; read & process sensor data (and return) diveloop_boot: call restart_set_modes_and_flags @@ -1515,9 +2061,45 @@ clrf WREG movff WREG,max_pressure+0 ; clear some variables movff WREG,max_pressure+1 + + ; init in invalid data state + clrf WREG ; set WREG to 0 + bsf WREG,int_invalid_flag ; set invalid flag + bsf WREG,int_is_zero ; set zero flag + movff WREG,int_O_tank_pres_need+1 ; Set flags for tank pressure needs = 0 before p2_deco.c + movff WREG,int_O_tank_pres_need+3 ; can do it. If this is not done here and the gas needs + movff WREG,int_O_tank_pres_need+5 ; custom view is shown before p2_deco.c completes the first + movff WREG,int_O_tank_pres_need+7 ; deco calculation, some rubbish numbers from last dive of + movff WREG,int_O_tank_pres_need+9 ; simulation may be shown + + ; configure the deco engine: + movff char_O_deco_status,WREG ; bank-safe copy + bsf WREG,DECO_STATUS_0_FLAG ; configure init ... + bsf WREG,DECO_STATUS_1_FLAG ; ... state, + bcf WREG,DECO_PLAN_FLAG ; normal plan mode, + bsf WREG,DECO_CNS_FLAG ; enable CNS calculation (CNS at end of dive), + bcf WREG,DECO_VOLUME_FLAG ; disable gas volume calculation, and + bcf WREG,DECO_ASCENT_FLAG ; disable delayed ascent calculation + movff WREG,char_O_deco_status ; bank-safe copy back + + clrf WREG + movff WREG,char_O_main_status ; reset char_O_main_status + movlw deco_distance + movff WREG,char_I_deco_distance + movff opt_last_stop,char_I_depth_last_deco + movff opt_GF_low,char_I_GF_Low_percentage + movff opt_GF_high,char_I_GF_High_percentage + bcf use_agf ; Start with normal GF set bcf divemode_menu ; clear divemode menu flag + + bcf alternative_divelayout ; Start with default layout + + bcf blinking_depth_prev ; clear flag for blinking depth ## NEW BUGFIX + bcf blinking_depth_warning ; clear flag for blinking depth ## NEW BUGFIX + bcf blinking_depth_toggle ; clear flag for blinking depth ## NEW BUGFIX + movlw d'1' movwf apnoe_max_pressure+0 clrf apnoe_max_pressure+1 @@ -1526,66 +2108,65 @@ clrf apnoe_mins clrf divemins+0 clrf divemins+1 - - bcf blinking_depth_prev ; clear flag for blinking depth ## NEW BUGFIX - bcf blinking_depth_warning ; clear flag for blinking depth ## NEW BUGFIX - bcf blinking_depth_toggle ; clear flag for blinking depth ## NEW BUGFIX -; Copy date and time for logbook + ; Copy date and time for logbook movff year,start_year movff month,start_month movff day,start_day movff hours,start_hours movff mins,start_mins - movff int_O_CNS_fraction+0,CNS_start+0 - movff int_O_CNS_fraction+1,CNS_start+1 ; Save CNS value at beginning of dive - movff char_O_gradient_factor,GF_start ; Save GF value at beginning of dive + movff int_O_CNS_fraction+0,CNS_start+0 ; save CNS value at beginning of dive + movff int_O_CNS_fraction+1,WREG ; get high byte to WREG + bcf WREG,int_warning_flag ; clear warning flag bit + movff WREG,CNS_start+1 ; move high byte on + movff int_O_gradient_factor+0,GF_start ; save GF value at beginning of dive (only lower byte used for value) - - bcf no_more_divesecs ; =1: Do no longer show seconds in divemode + bcf no_more_divesecs ; =1: do no longer show seconds in divemode bcf divemode_menu_active clrf menupos - clrf menupos2 ; Reset to zero (Zero=no premenu or simulator task) - + clrf menupos2 ; Reset to zero (Zero=no premenu or simulator task) + bsf sensors_agree ; init of sensors disagree warning system + btfsc FLAG_ccr_mode bra diveloop_boot_cc btfsc FLAG_pscr_mode bra diveloop_boot_cc rcall dive_boot_oc bra diveloop_boot_cont + diveloop_boot_cc: - rcall dive_boot_cc + rcall dive_boot_cc + diveloop_boot_cont: - ; Copy opt_dil_types into backup (For "lost gas" feature) - movff opt_dil_type+0,opt_dil_type_backup+0 ; 0=Disabled, 1=First, 2=Normal - movff opt_dil_type+1,opt_dil_type_backup+1 ; 0=Disabled, 1=First, 2=Normal - movff opt_dil_type+2,opt_dil_type_backup+2 ; 0=Disabled, 1=First, 2=Normal - movff opt_dil_type+3,opt_dil_type_backup+3 ; 0=Disabled, 1=First, 2=Normal - movff opt_dil_type+4,opt_dil_type_backup+4 ; 0=Disabled, 1=First, 2=Normal + movff opt_dil_type+0,opt_dil_type_backup+0 ; 0=Disabled, 1=First, 2=Normal + movff opt_dil_type+1,opt_dil_type_backup+1 ; 0=Disabled, 1=First, 2=Normal + movff opt_dil_type+2,opt_dil_type_backup+2 ; 0=Disabled, 1=First, 2=Normal + movff opt_dil_type+3,opt_dil_type_backup+3 ; 0=Disabled, 1=First, 2=Normal + movff opt_dil_type+4,opt_dil_type_backup+4 ; 0=Disabled, 1=First, 2=Normal ; Copy opt_gas_types into backup (For "lost gas" feature) - movff opt_gas_type+0,opt_gas_type_backup+0 ; 0=Disabled, 1=First, 2=Travel, 3=Deco - movff opt_gas_type+1,opt_gas_type_backup+1 ; 0=Disabled, 1=First, 2=Travel, 3=Deco - movff opt_gas_type+2,opt_gas_type_backup+2 ; 0=Disabled, 1=First, 2=Travel, 3=Deco - movff opt_gas_type+3,opt_gas_type_backup+3 ; 0=Disabled, 1=First, 2=Travel, 3=Deco - movff opt_gas_type+4,opt_gas_type_backup+4 ; 0=Disabled, 1=First, 2=Travel, 3=Deco + movff opt_gas_type+0,opt_gas_type_backup+0 ; 0=Disabled, 1=First, 2=Travel, 3=Deco + movff opt_gas_type+1,opt_gas_type_backup+1 ; 0=Disabled, 1=First, 2=Travel, 3=Deco + movff opt_gas_type+2,opt_gas_type_backup+2 ; 0=Disabled, 1=First, 2=Travel, 3=Deco + movff opt_gas_type+3,opt_gas_type_backup+3 ; 0=Disabled, 1=First, 2=Travel, 3=Deco + movff opt_gas_type+4,opt_gas_type_backup+4 ; 0=Disabled, 1=First, 2=Travel, 3=Deco ; Also copy change depths into backup (For "lost gas" feature) - movff char_I_dil_change+0,opt_dil_change_backup+0 ; Gas change depths Diluents - movff char_I_dil_change+1,opt_dil_change_backup+1 ; Gas change depths Diluents - movff char_I_dil_change+2,opt_dil_change_backup+2 ; Gas change depths Diluents - movff char_I_dil_change+3,opt_dil_change_backup+3 ; Gas change depths Diluents - movff char_I_dil_change+4,opt_dil_change_backup+4 ; Gas change depths Diluents + movff char_I_dil_change+0,opt_dil_change_backup+0 ; Gas change depths Diluents + movff char_I_dil_change+1,opt_dil_change_backup+1 ; Gas change depths Diluents + movff char_I_dil_change+2,opt_dil_change_backup+2 ; Gas change depths Diluents + movff char_I_dil_change+3,opt_dil_change_backup+3 ; Gas change depths Diluents + movff char_I_dil_change+4,opt_dil_change_backup+4 ; Gas change depths Diluents ; Also copy change depths into backup (For "lost gas" feature) - movff opt_OC_bail_gas_change+0,opt_OC_bail_gas_change_backup+0 ; Gas change depths OC/Bailout - movff opt_OC_bail_gas_change+1,opt_OC_bail_gas_change_backup+1 ; Gas change depths OC/Bailout - movff opt_OC_bail_gas_change+2,opt_OC_bail_gas_change_backup+2 ; Gas change depths OC/Bailout - movff opt_OC_bail_gas_change+3,opt_OC_bail_gas_change_backup+3 ; Gas change depths OC/Bailout - movff opt_OC_bail_gas_change+4,opt_OC_bail_gas_change_backup+4 ; Gas change depths OC/Bailout + movff opt_OC_bail_gas_change+0,opt_OC_bail_gas_change_backup+0; Gas change depths OC/Bailout + movff opt_OC_bail_gas_change+1,opt_OC_bail_gas_change_backup+1; Gas change depths OC/Bailout + movff opt_OC_bail_gas_change+2,opt_OC_bail_gas_change_backup+2; Gas change depths OC/Bailout + movff opt_OC_bail_gas_change+3,opt_OC_bail_gas_change_backup+3; Gas change depths OC/Bailout + movff opt_OC_bail_gas_change+4,opt_OC_bail_gas_change_backup+4; Gas change depths OC/Bailout clrf better_gas_number ; Clear better gas register - bcf show_safety_stop ;=1: Show the safety stop + bcf show_safety_stop ; =1: Show the safety stop clrf safety_stop_countdown ; Clear count-down clrf samplesecs @@ -1598,9 +2179,9 @@ clrf average_depth_hold_total+1 clrf average_depth_hold_total+2 clrf average_depth_hold_total+3 ; Clear Non-Resettable Average - rcall reset_average1 ; Reset the resettable average depth - bcf decostop_active - bcf better_gas_available ;=1: A better gas is available and a gas change is advised in divemode + rcall reset_average1 ; Reset the resettable average depth + bcf decostop_active + bcf better_gas_available ; =1: A better gas is available and a gas change is advised in divemode call ghostwriter_short_header ; Write short header with divenumber into profile memory btfsc simulatormode_active @@ -1613,17 +2194,17 @@ diveloop_boot_1: ; Simulator mode: Surface pressure is 1bar. movlw LOW .1000 - movff WREG,int_I_pres_surface+0 ; LOW copy surfacepressure to deco routine + movff WREG,int_I_pres_surface+0 ; LOW copy surfacepressure to deco routine movlw HIGH .1000 - movff WREG,int_I_pres_surface+1 ; HIGH copy surfacepressure to deco routine + movff WREG,int_I_pres_surface+1 ; HIGH copy surfacepressure to deco routine diveloop_boot_2: SAFE_2BYTE_COPY temperature,minimum_temperature ; Reset Min-Temp registers ; Init profile recording parameters - movff samplingrate,samplesecs_value ; to avoid EEPROM access in the ISR + movff samplingrate,samplesecs_value ; to avoid EEPROM access in the ISR movlw div_temperature - movwf divisor_temperature ; load divisors for profile storage + movwf divisor_temperature ; load divisors for profile storage movlw div_deco movwf divisor_deco movlw div_gf @@ -1637,14 +2218,16 @@ movlw div_tank movwf divisor_tank - btfss FLAG_apnoe_mode ; In Apnoe mode? + btfss FLAG_apnoe_mode ; In Apnoe mode? bra divemode_boot1 -; Overwrite some parameters in Apnoe mode.... + + ; Overwrite some parameters in Apnoe mode.... movlw samplingrate_apnoe - movwf samplesecs_value ; to avoid EEPROM access in the ISR + movwf samplesecs_value ; to avoid EEPROM access in the ISR + divemode_boot1: - bsf ccr_diluent_setup ; For CCR mode (Required to have better gas working) - btfsc FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active + bsf ccr_diluent_setup ; For CCR mode (Required to have better gas working) + btfsc FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active bra divemode_boot2 btfsc FLAG_pscr_mode bra divemode_boot2 @@ -1653,84 +2236,115 @@ movlw .0 movwf divisor_ppo2_sensors - bcf ccr_diluent_setup ; For OC mode (Required to have better gas working) + bcf ccr_diluent_setup ; For OC mode (Required to have better gas working) + divemode_boot2: - bcf LEDg bcf LEDr bcf realdive - btfss simulatormode_active ; do not disable in simulator mode! - call disable_rs232 ; Disable RS232 - btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) - call enable_rs232 ; Also sets to speed_normal ... + btfss simulatormode_active ; do not disable in simulator mode! + call disable_rs232 ; Disable RS232 + btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) + call enable_rs232 ; Also sets to speed_normal ... ; Reset divetime seconds - movlw .2 ; Start at 2seconds + movlw .2 ; Start at 2seconds movwf total_divetime_seconds+0 clrf total_divetime_seconds+1 movwf divesecs movwf apnoe_secs - bsf divemode2 ; displayed divetime is running (Divetime starts HERE) - - return ; Done with divemode boot + bsf divemode2 ; displayed divetime is running (Divetime starts HERE) + return ; Done with divemode boot divemode_check_for_warnings: - movlw .2 - cpfsgt warning_counter ; only two warnings active? - bra divemode_check_for_warnings1 ; Yes, update every second + movlw .1 ; One warning at a time in alt. layout mode + btfss alternative_divelayout + movlw .2 ; Two warnings at a time in default layout mode + cpfsgt warning_counter ; only one (or two) warnings active? + bra divemode_check_for_warnings1 ; Yes, update every second - btfss secs,0 ; Every two seconds... + btfss secs,0 ; Every two seconds... return - btfss secs,1 ; Every four seconds... + btfss secs,1 ; Every four seconds... return divemode_check_for_warnings1: - movf warning_counter_backup,W - cpfseq warning_counter ; warning_counter_backup = warning_counter? - call TFT_clear_warning_text ; No, clear all warnings - movff warning_counter,warning_counter_backup ; copy warning_counter - - bcf warning_active ; Clear flag + bcf warning_active ; Clear flag clrf warning_counter ; Clear counter + ; warnings sorted by severity, highest severity first + ; Warnings for all modes call check_warn_battery ; Check if the battery level should be displayed/warned call check_divetimeout ; Not actually a warning. Check and show the divemode timeout - btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode + btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode bra divemode_check_for_warnings2 - btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode + btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode bra divemode_check_for_warnings2 ; Warnings only in deco modes - rcall check_ppO2 ; check ppO2 and displays warning, if required + rcall check_ppO2 ; check ppO2 and displays warning, if required - rcall check_cns_violation ; Check CNS value and display it, if required + btfss sensors_agree ; are the sensor values within the threshold range? + rcall check_warn_sensors_disagree ; NO - further evaluate + btfsc sensors_agree ; are the sensor values within the threshold range? + bcf sensor_warning ; YES - revoke memorized sensor warning + + movff char_O_deco_warnings,WREG ; bank-safe copy for deco warnings + btfsc WREG,outside_warning_lock ; are we outside of the ZH-L16 model? + rcall warn_outside ; YES + + rcall check_IBCD ; check for IBCD attention or warning + btfsc decostop_active ; In deco mode? - rcall check_and_store_gf_violation ; Yes, Sets warnings, if required - btfsc decostop_active ; In deco mode? - call TFT_ftts ; Show @+x time + rcall check_and_store_gf_violation ; Yes, sets warnings, if required + + movff char_O_deco_warnings,WREG ; bank-safe copy for deco warnings + btfsc WREG,mbubble_warning_lock ; do we have a microbubbles warning? + rcall warn_mbubbles ; YES + + rcall check_cns_violation ; Check CNS value and display it, if required + + ;btfsc decostop_active ; In deco mode? + rcall check_gas_needs ; show gas needs warning if any gas need is > threshold + + rcall check_eod_cns_violation ; Check CNS values for end-of-dive and display warning, if required + + call TFT_display_ftts ; Show @+x time + btfsc use_agf ; In aGF mode? rcall warn_agf ; Yes, show a warning for it + btfsc setpoint_fallback ; =1: Fallback to SP1 due to external O2 sensor failure rcall warn_fallback ; Show the warning - + divemode_check_for_warnings2: ; Display the warning icon? - btfsc warning_active ; Any warning active? - call TFT_divemode_warning ; Yes - btfss warning_active ; Any warning active? - call TFT_divemode_warning_clear ; No, clear warning icon + btfsc warning_active ; Any warning active? + bsf FLAG_TFT_divemode_warning ; Yes + btfss warning_active ; Any warning active? + bsf FLAG_TFT_divemode_warning_clear ; No, clear warning icon ; Setup warning_page number incf warning_page,F + movf warning_page,W bcf STATUS,C - rlcf warning_page,W ; *2 + btfss alternative_divelayout + rlcf warning_page,W ; *2 (But only in standard layout mode) cpfsgt warning_counter ; > warning_counter clrf warning_page ; No, clear - + +; Clear both rows of warnings if there is nothing to show at all + tstfsz warning_counter ; any warnings? + bra divemode_check_for_warnings3 ; YES - look if second row needs to be cleared + bsf FLAG_TFT_dive_warning_text_clear ; Set flag + return +divemode_check_for_warnings3: + + ; Clear 2nd row of warnings if there is nothing to show (on this page) btfss second_row_warning ; =1: The second row contains a warning - call TFT_clear_warning_text_2nd_row ; No, clear this row + bsf FLAG_TFT_dive_warning_text_clr2 ; Set flag for 2nd row return ; Done. global check_warn_battery @@ -1738,210 +2352,192 @@ movff batt_percent,lo movlw battery_show_level+1 cpfslt lo - return ; No Display, no warning + return ; No Display, no warning ; Display Battery, but warn? movff batt_percent,lo movlw color_code_battery_low+1 - cpfsgt lo ; - bsf warning_active ; Set Warning flag + cpfsgt lo ; + bsf warning_active ; Set Warning flag movlw .4 - cpfseq menupos3 ; battery shown in Custom View 4? - bra check_warn_battery2 ; No - return ; Yes, do not show twice (in custom view and in warning area) + cpfseq menupos3 ; battery shown in Custom View 4? + bra check_warn_battery2 ; No + return ; Yes, do not show twice (in custom view and in warning area) check_warn_battery2: - incf warning_counter,F ; increase counter - goto TFT_update_batt_percent_divemode ; Show percent (And return) + incf warning_counter,F ; increase counter + goto TFT_update_batt_percent_divemode ; Show percent (And return) check_divetimeout: btfsc divemode2 - return ; displayed divetime is not running - incf warning_counter,F ; increase counter - goto TFT_divetimeout ; Show timeout counter (and return) + return ; displayed divetime is not running + incf warning_counter,F ; increase counter + goto TFT_divetimeout ; Show timeout counter (and return) -check_ppO2: ; check current ppO2 and display warning if required - btfss FLAG_pscr_mode - bra check_ppO2_non_pscr ; Non-PSCR modes... - ; in PSCR mode - btfsc is_bailout - bra check_ppO2_non_pscr ; Non-PSCR modes... - - call compute_pscr_ppo2 ; pSCR ppO2 into sub_c:2 - movff sub_c+0,xA+0 - movff sub_c+1,xA+1 - movlw d'100' - movwf xB+0 - clrf xB+1 - call div16x16 ; /100 - tstfsz xC+1 ; Is ppO2 > 2.55bar ? - setf xC+0 ; yes: bound to 2.55... better than wrap around. - movff xC+0,char_I_actual_ppO2 ; copy last ppO2 to buffer register (for pSCR CNS) - clrf xC+2 - clrf xC+3 - movff sub_c+0,xC+0 - movff sub_c+1,xC+1 ; copy for comptibility - bra check_ppO2_check - -check_ppO2_non_pscr: - SAFE_2BYTE_COPY amb_pressure, xA - movlw d'10' - movwf xB+0 - clrf xB+1 - call div16x16 ; xC=p_amb/10 - - movff xC+0,xA+0 - movff xC+1,xA+1 - movff char_I_O2_ratio,xB+0 ; =O2 ratio - clrf xB+1 - call mult16x16 ; char_I_O2_ratio * p_amb/10 - -check_ppO2_check: - ; Check very high ppO2 manually - tstfsz xC+2 ; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar? - bra check_ppO2_1 ; Yes, display Value! - ; Check if ppO2>3,30bar - btfsc xC+1,7 - bra check_ppO2_1 ; Yes! - - ; Check for low ppo2 - movff xC+0,sub_b+0 - movff xC+1,sub_b+1 - movff opt_ppO2_min,WREG - mullw d'100' ; opt_ppO2_min*100 - movff PRODL,sub_a+0 - movff PRODH,sub_a+1 - call subU16 - btfsc neg_flag - bra check_ppO2_0 ; Not too low - ; ppO2 low - rcall check_ppo2_display ; display if not already shown in custom view - movlw d'4' ; Type of Alarm (ppO2 low) - movwf AlarmType ; Copy to Alarm Register - bsf event_occured ; Set Event Flag - bsf warning_active ; Set Warning flag - return ; Done. - -check_ppO2_0: - ; Check if ppO2 should be displayed - movlw .0 - TSTOSS opt_showppo2 ; 0=no, 1=always show - movlw ppo2_display_high - mullw d'100' ; ppo2_display_high*100 - movff PRODL,sub_a+0 - movff PRODH,sub_a+1 - call subU16 - btfss neg_flag - return ; No Display, no warning - ; Display ppO2, but warn? - rcall check_ppo2_display ; display if not already shown in custom view - -;check if we are within our warning thresholds! - movff xC+0,sub_b+0 - movff xC+1,sub_b+1 - ;active_gas_type -> 0=Disabled, 1=First, 2=Travel, 3=Deco for OC gases and 0=Disabled, 1=First, 2=Normal for diluents - movff active_gas_type,xA+0 ; xA+0 used as temp here -> holds type - movff opt_ppO2_max_deco,xB+1 ; xB+1 used as temp here - movlw .3 - cpfseq xA+0 ; Deco? - movff opt_ppO2_max,xB+1 ; No, overwrite with travel/bottom max - movf xB+1,W ; Result in WREG - mullw d'100' ; opt_ppO2_max*100 - movff PRODL,sub_a+0 - movff PRODH,sub_a+1 - infsnz sub_a+0,F - incf sub_b+1,F - call subU16 - btfss neg_flag - return ; Done. Not too high - movlw d'5' ; Type of Alarm (ppO2 high) - movwf AlarmType ; Copy to Alarm Register - bsf event_occured ; Set Event Flag - bsf warning_active ; Set Warning flag - return ; Done. - -check_ppO2_1: ; ppO2 very high - rcall check_ppo2_display ; display if not already shown in custom view - movlw d'5' ; Type of Alarm - movwf AlarmType ; Copy to Alarm Register - bsf event_occured ; Set Event Flag - bsf warning_active ; Set Warning flag - return ; Done. - -check_ppo2_display: +check_ppO2: + btfsc FLAG_ccr_mode ; are we in CCR mode? + bra check_ppO2_loop ; YES + btfsc FLAG_pscr_mode ; are we in pSCR mode? + bra check_ppO2_loop ; YES + bra check_ppO2_oc_1 ; NO - neither CCR nor pSCR +check_ppO2_loop: + btfsc is_bailout ; in bailout? + bra check_ppO2_oc_1 ; YES - continue with OC + movff int_O_pure_ppO2+1,hi ; NO - get upper part of int_O_pure_ppO2 + btfsc hi,int_warning_flag ; ppO2 of the pure diluent to low or high? + rcall check_ppO2_d ; YES - show warning and return on next line + bra check_ppO2_oc_2 ; skip pre-warning threshold test on breathed ppO2 +check_ppO2_oc_1: + movff int_O_breathed_ppO2+1,WREG ; get upper part of int_O_breathed_ppO2 + btfsc WREG,int_prewarning_flag ; breathed ppO2 just above pre-warning threshold? + bra check_ppo2_display ; YES - show ppO2 +check_ppO2_oc_2: + movff int_O_breathed_ppO2+1,WREG ; get upper part of int_O_breathed_ppO2 (perhaps again) + btfsc WREG,int_low_flag ; breathed ppO2 to low? + bra check_ppO2_low ; YES - record the warning and show ppO2 + btfsc WREG,int_high_flag ; breathed ppO2 to high? + bra check_ppO2_high ; YES - record the warning and show ppO2 + TSTOSS opt_showppo2 ; show ppO2 anyhow? (0 = no, 1 = show always) + return ; NO - no warnings, no show + bra check_ppo2_display ; YES - just show ppO2 +check_ppO2_low: + movlw d'4' ; set type of alarm (ppO2 low) + bra check_ppO2_common ; continue with common part +check_ppO2_high: + movlw d'5' ; set type of alarm (ppO2 high) +check_ppO2_common: + movwf AlarmType ; copy alarm type to alarm register + bsf event_occured ; set event flag + bsf warning_active ; set warning flag + btfsc is_bailout ; are we in bailout? + bra check_ppo2_display ; YES - skip CCR/pSCR checks + btfsc FLAG_ccr_mode ; are we in CCR mode? + return ; YES - no extra warning required + btfsc FLAG_pscr_mode ; are we in pSCR mode? + return ; YES - no extra warning required +check_ppo2_display: ; display warning if ppO2 is not already shown in custom view movlw .9 - cpfseq menupos3 ; ppO2 shown in Custom View 9? - bra check_ppO2_a ; No - return ; Yes, do not show twice (in custom view and in warning area) + cpfseq menupos3 ; ppO2 shown in Custom View 9? + bra check_ppO2_a ; No + return ; Yes, do not show twice (in custom view and in warning area) check_ppO2_a: movlw .11 - cpfseq menupos3 ; ppO2 shown in Custom View 11? - bra check_ppO2_b ; No - return ; Yes, do not show twice (in custom view and in warning area) + cpfseq menupos3 ; ppO2 shown in Custom View 11? + bra check_ppO2_b ; No + return ; Yes, do not show twice (in custom view and in warning area) check_ppO2_b: movlw .12 - cpfseq menupos3 ; ppO2 shown in Custom View 12? - bra check_ppO2_c ; No - return ; Yes, do not show twice (in custom view and in warning area) + cpfseq menupos3 ; ppO2 shown in Custom View 12? + bra check_ppO2_c ; No + return ; Yes, do not show twice (in custom view and in warning area) check_ppO2_c: movlw .10 - cpfseq menupos3 ; ppO2 shown in Custom View 10? - bra check_ppO2_d ; No - return ; Yes, do not show twice (in custom view and in warning area) + cpfseq menupos3 ; ppO2 shown in Custom View 10? + bra check_ppO2_d ; No + return ; Yes, do not show twice (in custom view and in warning area) check_ppO2_d: - incf warning_counter,F ; increase counter - goto TFT_display_ppo2 ; Show ppO2 (and return) + incf warning_counter,F ; increase counter + goto TFT_display_ppo2 ; show breathed gas or diluent ppO2 warning (and return) + global check_cns_violation check_cns_violation: ; Check if CNS should be displayed - movff int_O_CNS_fraction+1,lo ; copy into bank1 - tstfsz lo ; >255% ? - bra check_cns_violation2 ; Yes - movff int_O_CNS_fraction+0,lo ; copy into bank1 - - movlw cns_warning_high ; cns_warning_high - subwf lo,W - btfsc STATUS,C - bsf warning_active ; Set Warning flag + movff int_O_CNS_fraction+1,WREG ; get high byte + btfsc WREG,int_warning_flag ; warning flag set? + bra check_cns_violation2 ; Yes - issue warning + btfsc WREG,int_prewarning_flag ; pre-warning flag set? + bra display_cns_violation ; YES - just display CNS + return ; No - no display, no warning +check_cns_violation2: + bsf warning_active ; Set Warning flag +display_cns_violation: ; Show CNS if not shown in the custom view + movlw .11 + cpfseq menupos3 ; CNS shown in Custom View? + bra display_cns_violation2 ; No + return ; Yes, do not show twice (in custom view and in warning area) +display_cns_violation2: + movlw .8 + cpfseq menupos3 ; CNS shown through Custom View 8 right now? + bra display_cns_violation3 ; No + return ; Yes, do not show twice (in custom view and in warning area) +display_cns_violation3: + incf warning_counter,F ; increase counter + goto TFT_display_cns ; Show CNS (and return) - movlw cns_display_high ; cns_display_high - subwf lo,W - btfss STATUS,C - return ; No Display, no warning - ; Display CNS - bra display_cns_violation -check_cns_violation2: - bsf warning_active ; Set Warning flag -display_cns_violation: ; Show CNS if not shown in the custom view - movlw .11 - cpfseq menupos3 ; CNS shown in Custom View? - bra display_cns_violation2 ; No - return ; Yes, do not show twice (in custom view and in warning area) -display_cns_violation2: - incf warning_counter,F ; increase counter - goto TFT_display_cns ; Show CNS (and return) - + global check_eod_cns_violation ; check end-of-dive CNS values +check_eod_cns_violation: + movff int_O_CNS_fraction+1,WREG ; get high-byte of current CNS value + btfsc WREG,int_warning_flag ; current CNS value in warning state? + return ; YES - inhibit eod warning if current CNS is already in warning + movff int_O_normal_CNS_fraction+1,WREG + btfsc WREG,int_invalid_flag ; flag for invalid value set? + bra check_eod_cns_violation1 ; YES - continue with checking the other CNS value + btfsc WREG,int_warning_flag ; NO - flag for warning set? + bra check_eod_cns_violation2 ; YES - issue warning +check_eod_cns_violation1: ; NO - continue with checking the other CNS value + movff int_O_alternate_CNS_fraction+1,WREG + btfsc WREG,int_invalid_flag ; flag for invalid value set? + return ; YES - done with CNS checking + btfsc WREG,int_warning_flag ; NO - flag for warning set? + bra check_eod_cns_violation2 ; Yes - issue warning + return ; NO - done with CNS checking +check_eod_cns_violation2: ; YES - issue warning + bsf warning_active ; set Warning flag + movlw .8 ; issue textual warning if CNS values are not shown in the custom view right now + cpfseq menupos3 ; CNS values shown through Custom View 8 right now? + bra display_eod_cns_violation ; NO - issue textual warning + return ; YES - do not show twice (in custom view and in warning area) +display_eod_cns_violation: + incf warning_counter,F ; increase counter + goto TFT_display_eod_cns ; issue CNS at end-of-dive warning (and return) + + global check_and_store_gf_violation check_and_store_gf_violation: - movff char_O_gradient_factor,lo ; gradient factor absolute (Non-GF model) - - movlw gf_warning_high - cpfsgt lo - bra check_and_store_gf_violation2 ; No warning - movlw d'2' ; Type of Alarm - movwf AlarmType ; Copy to Alarm Register - bsf event_occured ; Set Event Flag + movff int_O_gradient_factor+1,WREG ; get upper byte of gradient factor + btfss WREG,int_warning_flag ; check if the warning flag is set + bra check_and_store_gf_violation2 ; NO - continue with checking for pre-warning + movlw d'2' ; YES - set type of alarm + movwf AlarmType ; copy to alarm register + bsf event_occured ; set event flag + bsf warning_active ; set warning flag + bra check_and_store_gf_violation3 ; show gf warning +check_and_store_gf_violation2: + btfsc WREG,int_prewarning_flag ; check if the pre-warning flag is set + bra check_and_store_gf_violation3 ; YES - show gf + TSTOSS opt_enable_IBCD ; NO - IBCD warning activated? + bra check_and_store_gf_violation4 ; NO - continue checking of deco info + movff char_O_deco_warnings,WREG ; YES - get the deco warnings vector + btfss WREG,IBCD_warning ; is the IBCD warning flag set? + bra check_and_store_gf_violation4 ; NO - continue checking for deco info +check_and_store_gf_violation3: ; YES - show gf + bsf warning_active ; set Warning flag + incf warning_counter,F ; increase counter + goto TFT_warning_gf ; show GF (and return) +check_and_store_gf_violation4: ; check for deco info + btfss divemode ; in divemode? + return ; NO - done, return + movff char_O_deco_warnings,WREG ; YES - get the deco warnings vector + btfss WREG,deco_flag ; check if the deco flag is set + return ; NO - all done, return + incf warning_counter,F ; YES - increase counter + goto TFT_info_deco ; show deco info + + +warn_outside: + incf warning_counter,F ; increase counter bsf warning_active ; Set Warning flag -check_and_store_gf_violation2: - movlw gf_display_high - cpfsgt lo - return ; No Display, no warning - ; Display GF + goto TFT_warning_outside ; show microbubbles warning (and return) + + + global warn_mbubbles +warn_mbubbles: incf warning_counter,F ; increase counter - goto TFT_warning_gf ; Show GF Warning (and return) - + bsf warning_active ; Set Warning flag + goto TFT_warning_mbubbles ; show microbubbles warning (and return) + warn_agf: incf warning_counter,F ; increase counter goto TFT_warning_agf ; Show aGF warning (and return) @@ -1951,5 +2547,87 @@ bsf warning_active ; Set Warning flag goto TFT_warning_fallback ; Show fallback warning (and return) + +check_gas_needs: + banksel int_O_tank_pres_need + movf int_O_tank_pres_need+1,w ; get HIGH(pres need of 1st tank) + iorwf int_O_tank_pres_need+3,w ; inclusive or with HIGH(pres need of 2nd tank) + iorwf int_O_tank_pres_need+5,w ; inclusive or with HIGH(pres need of 3rd tank) + iorwf int_O_tank_pres_need+7,w ; inclusive or with HIGH(pres need of 4th tank) + iorwf int_O_tank_pres_need+9,w ; inclusive or with HIGH(pres need of 5th tank) + banksel common + btfsc WREG,int_invalid_flag ; check if invalid flag is set + return ; YES - no further checking required + btfsc WREG,int_warning_flag ; NO - check if any gas has a pres_need >= pres_fill + bsf warning_active ; YES - set warning flag + btfsc WREG,int_warning_flag ; NO - check if any gas has a pres_need >= pres_fill + goto TFT_warning_gas_needs_warn ; Yes - show a warning + btfsc WREG,int_prewarning_flag ; NO - check if any gas has a pres_need >= pres_fill * threshold + goto TFT_warning_gas_needs_att ; YES - show an attention + bcf gas_needs_attention ; NO - clear flag for a new attention + bcf gas_needs_warning ; clear flag for a new warning + return + +check_warn_sensors_disagree: + incf warning_counter,F ; increase counter + bsf warning_active ; YES - set Warning flag + goto TFT_warning_sensor_disagree ; show sensor disagree warning (and return) + + +check_IBCD: + TSTOSS opt_enable_IBCD ; IBCD warning activated? + return ; NO - done + movff char_O_deco_warnings,WREG ; YES - get deco warnings vector + btfss WREG,IBCD_warning ; IBCD warning flag set? + return ; NO - return + incf warning_counter,F ; YES - increase counter + goto TFT_warning_IBCD ; write warning to display + + + + global restart_deco_engine + global restart_deco_engine_wo_ceiling +restart_deco_engine: + ; make bank save copies and set flags for invalid data + movff int_O_ceiling+1,WREG + bsf WREG,char_invalid_flag ; int_O_ceiling has its invalid flag on a char's position! + movff WREG,int_O_ceiling+1 + +restart_deco_engine_wo_ceiling: + ; make more bank save copies and set more flags for invalid data + movff char_O_deco_gas+0,WREG + bsf WREG,char_invalid_flag + movff WREG,char_O_deco_gas+0 + + movff int_O_ascenttime+1,WREG + bsf WREG,int_invalid_flag + movff WREG,int_O_ascenttime+1 + + movff int_O_alternate_ascenttime+1,WREG + bsf WREG,int_invalid_flag + movff WREG,int_O_alternate_ascenttime+1 + + movff int_O_normal_CNS_fraction+1,WREG + bsf WREG,int_invalid_flag + movff WREG,int_O_normal_CNS_fraction+1 + + movff int_O_alternate_CNS_fraction+1,WREG + bsf WREG,int_invalid_flag + movff WREG,int_O_alternate_CNS_fraction+1 + + movff int_O_tank_pres_need+1,WREG + bsf WREG,int_invalid_flag + movff WREG,int_O_tank_pres_need+1 + + ; restart deco engine + movff char_O_deco_status,WREG ; get current deco engine configuration + bcf WREG,DECO_STATUS_0_FLAG ; set status flags to... + bcf WREG,DECO_STATUS_1_FLAG ; ... DECO_STATUS_START + bsf WREG,DECO_PLAN_FLAG ; fake we came from alternative plan to force normal plan to be done next + movff WREG,char_O_deco_status ; write back new configuration to restart deco computations + + return + + END \ No newline at end of file
--- a/src/divemode.inc Wed Dec 27 14:34:11 2017 +0100 +++ b/src/divemode.inc Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File divemode.inc +; File divemode.inc REFACTORED VERSION V2.91 ; ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. @@ -11,6 +11,8 @@ extern set_dive_modes extern diveloop extern apnoe_calc_maxdepth + extern calc_deko_divemode_sensor + ; Divemode layout: ; row=0...239 @@ -73,6 +75,9 @@ #DEFINE dm_max_depth_dm_row dm_max_depth_row+.11 ; 25 #DEFINE dm_max_depth_dm_column dm_max_depth_column+.23 ; 87 #DEFINE dm_max_depth_dm_column_nvsi dm_max_depth_column_nvsi+.23 ; 77 +#DEFINE dm_max_alt_column .0 +#DEFINE dm_max_alt_row .170 +#DEFINE dm_max_dm_alt_column dm_max_alt_column+.60 ; Warning area (combined) #DEFINE dm_warning_row dm_offset+.36 ; 50 #DEFINE dm_warning_column dm_upcnt_2ndcol ; 74 @@ -99,6 +104,8 @@ #DEFINE dm_divetime_rgt .159 ; 159 #DEFINE dm_divetime_secs_row dm_divetime_row+.11 ; 25 #DEFINE dm_divetime_secs_column dm_divetime_column+.24 ; 139 +#DEFINE dm_divetime_alt_row dm_offset ; 14 +#DEFINE dm_divetime_alt_column .68 ; Warning icon #DEFINE dm_warning_icon_row dm_offset+.41 ; 55 #DEFINE dm_warning_icon_column .137 ; 137 @@ -262,7 +269,7 @@ #DEFINE dm_custom_ceiling_text_row dm_customview_row+.1 ; 102 #DEFINE dm_custom_ceiling_text_column .68 ; 66 #DEFINE dm_custom_ceiling_ppo2_column .8 ; 8 -#DEFINE dm_custom_ceiling_ppo2_col_dil .0 ; 0 NEW tuned position because text is longer +#DEFINE dm_custom_ceiling_ppo2_col_dil .0 ; 0 NEW tuned position because text is longer ## (?) ; Value #DEFINE dm_custom_ceiling_value_row dm_customview_row+.18 ; 119
--- a/src/gaslist.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/gaslist.asm Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File gaslist.asm +; File gaslist.asm ## V2.95 ; ; Managing OSTC gas list ; @@ -58,12 +58,12 @@ ; Append current mix to current string (For divemode) ; Input: FSR2 : Current string position. ; Output: Text appended into buffer pointed by FSR2. - global gaslist_strcat_gasx -gaslist_strcat_gasx: ; Show current O2/He mix + global gaslist_strcat_gas6 +gaslist_strcat_gas6: ; Show current O2/He mix STRCAT_TEXT tGas STRCAT ": " - movff char_I_O2_ratio,lo - movff char_I_He_ratio,hi + movff gas6_O2_ratio,lo + movff gas6_He_ratio,hi goto customview_show_mix ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2, and RETURN global gaslist_show_type @@ -556,7 +556,7 @@ return ;---------------------------------------------------------------------------- -; Compute MOD from opt_ppO2_max/opt_ppO2_max_deco and current O2 Ratio. +; Compute MOD from char_I_ppO2_max/char_I_ppO2_max_deco and current O2 Ratio. ; ; Input: gaslist_gas = current gas index. ; opt_gas_O2_ratio[gaslist_gas] = current O2 ratio @@ -578,10 +578,10 @@ lfsr FSR1,opt_gas_type ; 0=Disabled, 1=First, 2=Travel, 3=Deco for OC gases and 0=Disabled, 1=First, 2=Normal for diluents movff PLUSW1,xA+0 ; xA+0 used as temp here -> holds type - movff opt_ppO2_max_deco,xB+1 ; xB+1 used as temp here + movff char_I_ppO2_max_deco,xB+1 ; xB+1 used as temp here movlw .3 cpfseq xA+0 ; Deco? - movff opt_ppO2_max,xB+1 ; No, overwrite with travel/bottom max + movff char_I_ppO2_max,xB+1 ; No, overwrite with travel/bottom max movf xB+1,W ; Result in WREG clrf xB+1 ; Clear for div16x16 @@ -599,7 +599,7 @@ extern TFT_color_code1 movwf hi ; Copy O2% movlw warn_gas_in_gaslist - call TFT_color_code1 ; Color-code current row in Gaslist (%O2 in hi), opt_ppO2_max/opt_ppO2_max_deco as threshold + call TFT_color_code1 ; Color-code current row in Gaslist (%O2 in hi), char_I_ppO2_max/char_I_ppO2_max_deco as threshold return ;----------------------------------------------------------------------------
--- a/src/ghostwriter.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/ghostwriter.asm Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File ghostwriter.asm +; File ghostwriter.asm REFACTORED VERSION 2.94 ; ; Ghostwriter (Log profile recorder) ; @@ -23,8 +23,8 @@ ghostwriter CODE global store_dive_data -store_dive_data: ; 5 seconds gone - bcf store_sample ; update only any 5 seconds +store_dive_data: + bcf store_sample ; clear flag ifndef __DEBUG btfsc simulatormode_active ; Are we in simulator mode? @@ -93,7 +93,7 @@ addwf EventByte,F ; Copy to EventByte Bit 0-3 clrf AlarmType ; Reset AlarmType -; Third, check events and add aditional bytes +; Third, check events and add additional bytes btfss gas6_changed ; Check flag bra check_event2 movlw d'2' ; Information length @@ -257,7 +257,7 @@ store_dive_ppO2_sensors: movf o2_ppo2_sensor1,W ; Sensor1 ppO2 (in 0.01bar steps) rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - SAFE_2BYTE_COPY o2_mv_sensor1,lo ; o2_mv_sensor may be modifified via ISR during the two writes here... + SAFE_2BYTE_COPY o2_mv_sensor1,lo ; o2_mv_sensor may be modified via ISR during the two writes here... movf lo,W ; in 0.1mV steps rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash movf hi,W ; in 0.1mV steps @@ -265,7 +265,7 @@ movf o2_ppo2_sensor2,W ; Sensor2 ppO2 (in 0.01bar steps) rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - SAFE_2BYTE_COPY o2_mv_sensor2,lo ; o2_mv_sensor may be modifified via ISR during the two writes here... + SAFE_2BYTE_COPY o2_mv_sensor2,lo ; o2_mv_sensor may be modified via ISR during the two writes here... movf lo,W ; in 0.1mV steps rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash movf hi,W ; in 0.1mV steps @@ -273,7 +273,7 @@ movf o2_ppo2_sensor3,W ; Sensor3 ppO2 (in 0.01bar steps) rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash - SAFE_2BYTE_COPY o2_mv_sensor3,lo ; o2_mv_sensor may be modifified via ISR during the two writes here... + SAFE_2BYTE_COPY o2_mv_sensor3,lo ; o2_mv_sensor may be modified via ISR during the two writes here... movf lo,W ; in 0.1mV steps rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash movf hi,W ; in 0.1mV steps @@ -284,8 +284,8 @@ return store_dive_gf: - movff char_O_gradient_factor,WREG ; gradient factor absolute - rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash + movff int_O_gradient_factor+0,WREG ; gradient factor absolute (range is limited to 255, only lower byte used for value) + rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash movlw div_gf movwf divisor_gf ; Reload divisor return @@ -346,14 +346,11 @@ movff last_surfpressure_30min+0,int_I_pres_surface+0 ; Pass surface to desat routine ! movff last_surfpressure_30min+1,int_I_pres_surface+1 - call deco_calc_desaturation_time ; calculate desaturation time - movlb b'00000001' ; select ram bank 1 - movff int_O_desaturation_time+0, desaturation_time+0 - movff int_O_desaturation_time+1, desaturation_time+1 ; Buffer - call calc_deko_surfmode - rcall calculate_noflytime ; Calc NoFly time - - ; store header and ... + call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode + + call deco_calc_desaturation_time ; calculate desaturation time + movlb b'00000001' ; select ram bank 1 + movlw 0xFD ; .... End-of-Profile Bytes rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash movlw 0xFD @@ -426,7 +423,7 @@ movf EEDATA,W rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - ; store pointer to end of diveprofile + ; store pointer to end of diveprofile movf ext_flash_log_pointer+0,W rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movf ext_flash_log_pointer+1,W @@ -479,30 +476,30 @@ movff lo,max_pressure+0 movff hi,max_pressure+1 - movff max_pressure+0,WREG ; Max. depth - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movff max_pressure+0,WREG ; Max. depth + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movff max_pressure+1,WREG - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash end_dive2: - movf divemins+0,W ; divetime minutes - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movf divemins+0,W ; divetime minutes + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movf divemins+1,W - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movf divesecs,W ; divetime seconds - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movff minimum_temperature+0,WREG ; minimum temperature - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movf divesecs,W ; divetime seconds + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movff minimum_temperature+0,WREG ; minimum temperature + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movff minimum_temperature+1,WREG - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movff last_surfpressure_30min+0,WREG ; airpressure before dive - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movff last_surfpressure_30min+0,WREG ; airpressure before dive + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movff last_surfpressure_30min+1,WREG - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movff int_O_desaturation_time+0,WREG ; desaturation time in minutes - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + movff int_O_desaturation_time+0,WREG ; desaturation time in minutes + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movff int_O_desaturation_time+1,WREG - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash btfss FLAG_ccr_mode ; In CCR mode... bra end_dive_oc_gaslist ; No, write OC gases @@ -601,11 +598,11 @@ ; bra end_dive_oc_cc_common end_dive_oc_cc_common: - movlw softwareversion_x ; Firmware version + movlw softwareversion_x ; Firmware version rcall ghostwrite_byte_header movlw softwareversion_y rcall ghostwrite_byte_header - movf batt_voltage+0,W ; Battery voltage + movf batt_voltage+0,W ; Battery voltage rcall ghostwrite_byte_header movf batt_voltage+1,W rcall ghostwrite_byte_header @@ -623,7 +620,7 @@ ; Gradient factor movff GF_start,WREG rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - movff char_O_gradient_factor,WREG + movff int_O_gradient_factor+0,WREG ; value limited to 255, only lower byte in use rcall ghostwrite_byte_header ; WREG -> Header in ext. flash ; Logbook offset @@ -707,13 +704,14 @@ lfsr FSR1,char_O_tissue_N2_saturation+0 end_dive_store_tissues_N2: movf POSTINC1,W + bcf WREG,7 ; clear flag bit for ongassing/offgassing rcall ghostwrite_byte_header ; WREG -> Header in ext. flash decfsz lo,F bra end_dive_store_tissues_N2 ; No movlw .64 movwf lo - lfsr FSR1,0x700;pres_tissue_N2+0 ; 16*4Byte Float = 64Bytes + lfsr FSR1,0x700;pres_tissue_N2+0 ; 16*4Byte Float = 64Bytes end_dive_store_tissues_N2_2: movf POSTINC1,W rcall ghostwrite_byte_header ; WREG -> Header in ext. flash @@ -725,13 +723,14 @@ lfsr FSR1,char_O_tissue_He_saturation+0 end_dive_store_tissues_He: movf POSTINC1,W + bcf WREG,7 ; clear flag bit for ongassing/offgassing rcall ghostwrite_byte_header ; WREG -> Header in ext. flash decfsz lo,F bra end_dive_store_tissues_He ; No movlw .64 movwf lo - lfsr FSR1,0x740;pres_tissue_He+0 ; 16*4Byte Float = 64Bytes + lfsr FSR1,0x740;pres_tissue_He+0 ; 16*4Byte Float = 64Bytes end_dive_store_tissues_He_2: movf POSTINC1,W rcall ghostwrite_byte_header ; WREG -> Header in ext. flash @@ -768,14 +767,14 @@ ; Header stop movlw 0xFB - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash movlw 0xFB - rcall ghostwrite_byte_header ; WREG -> Header in ext. flash + rcall ghostwrite_byte_header ; WREG -> Header in ext. flash - call divemode_store_statistics ; Store/update statistics for this unit + call divemode_store_statistics ; Store/update statistics for this unit clrf surface_interval+0 - clrf surface_interval+1 ; Clear surface interval timer + clrf surface_interval+1 ; Clear surface interval timer ghostwriter_end_dive_common: ; Update ext_flash_log_pointer into EEPROM @@ -787,30 +786,30 @@ movff ext_flash_log_pointer+2,EEDATA write_int_eeprom .6 - bcf simulatormode_active ; if we were in simulator mode + bcf simulatormode_active ; if we were in simulator mode ; In DEBUG compile, keep all simulated dives in logbook, Desat time, nofly, etc... ifndef __DEBUG - extern deco_pull_tissues_from_vault - btfsc restore_deco_data ; Restore decodata? - call deco_pull_tissues_from_vault - banksel common ; Bank1 + extern deco_pull_tissues_from_vault + btfsc restore_deco_data ; Restore decodata? + call deco_pull_tissues_from_vault + banksel common ; Bank1 endif - call update_battery_registers ; update battery registers into EEPROM - goto surfloop ; and return to surfaceloop + call update_battery_registers ; update battery registers into EEPROM + goto surfloop ; and return to surfaceloop ghostwriter_end_dive_common_sim: - tstfsz surface_interval+0 ; Was interval zero? + tstfsz surface_interval+0 ; Was interval zero? bra ghostwriter_end_dive_common_sim2 ; No - tstfsz surface_interval+1 ; Was interval zero? + tstfsz surface_interval+1 ; Was interval zero? bra ghostwriter_end_dive_common_sim2 ; No - bra ghostwriter_end_dive_common ; Yes, done. + bra ghostwriter_end_dive_common ; Yes, done. ghostwriter_end_dive_common_sim2: movf divemins+0,W addwf surface_interval+0,F movf divemins+1,W - addwfc surface_interval+1 ; Add simulated divetime to surface interval + addwfc surface_interval+1 ; Add simulated divetime to surface interval bra ghostwriter_end_dive_common ghostwriter_load_pointer: ; Load ext_flash_address:3 from EEPROM .4-.6 @@ -957,47 +956,6 @@ rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash return - -calculate_noflytime: - ; calculate nofly time - movff int_O_desaturation_time+0,xA+0 - movff int_O_desaturation_time+1,xA+1 - - btfsc xA+1,7 ; Is desat time negative ? - bra calculate_noflytime_3 ; Then surely not valid ! - - tstfsz xA+0 ; Desat=0? - bra calculate_noflytime2 - tstfsz xA+1 ; Desat=0? - bra calculate_noflytime2 - -calculate_noflytime_3: - ; Desaturation time = zero - clrf nofly_time+0 ; Clear nofly time - clrf nofly_time+1 ; Clear nofly time - return - -calculate_noflytime2: - movff xA+0,int_I_temp+0 - movff xA+1,int_I_temp+1 - movlw no_fly_time_ratio ; nofly_time_ratio - movff WREG,char_I_temp - call deco_calc_percentage - movlb b'00000001' ; select ram bank 1 - movff int_I_temp+0,xA+0 - movff int_I_temp+1,xA+1 - tstfsz xA+0 ; Desat=0? - bra calculate_noflytime_2_final - tstfsz xA+1 ; Desat=0? - bra calculate_noflytime_2_final - bra calculate_noflytime_3 - -calculate_noflytime_2_final: - movff xA+0,nofly_time+0 - movff xA+1,nofly_time+1 - return - - divemode_store_statistics: ; Store/update statistics for this unit rcall vault_decodata_into_eeprom ; update deco data rcall do_logoffset_common_read ; Existing logbook offset into lo:hi @@ -1103,19 +1061,19 @@ write_int_eeprom .7 movff int_O_CNS_fraction+1,EEDATA write_int_eeprom .8 - movff desaturation_time+0,EEDATA + movff int_O_desaturation_time+0,EEDATA write_int_eeprom .9 - movff desaturation_time+1,EEDATA + movff int_O_desaturation_time+1,EEDATA write_int_eeprom .10 movff surface_interval+0,EEDATA write_int_eeprom .11 movff surface_interval+1,EEDATA write_int_eeprom .12 - movff char_O_gradient_factor,EEDATA + movff int_O_gradient_factor+0,EEDATA ; value limited to 255, only lower byte in use for value write_int_eeprom .13 - movff nofly_time+0,EEDATA + movff int_O_nofly_time+0,EEDATA write_int_eeprom .14 - movff nofly_time+1,EEDATA + movff int_O_nofly_time+1,EEDATA write_int_eeprom .15 ; Tissue data from 16 to 144 @@ -1123,7 +1081,7 @@ movwf EEADR movlw .128 movwf lo - lfsr FSR1,0x700;pres_tissue_N2+0 ; 32*4Byte Float = 128Bytes + lfsr FSR1,0x700;pres_tissue_N2+0 ; 32*4Byte Float = 128Bytes vault_decodata_into_eeprom2: movff POSTINC1,EEDATA call write_eeprom ; EEDATA into EEPROM@EEADR @@ -1160,31 +1118,31 @@ read_int_eeprom .8 movff EEDATA,int_O_CNS_fraction+1 read_int_eeprom .9 - movff EEDATA,desaturation_time+0 + movff EEDATA,int_O_desaturation_time+0 read_int_eeprom .10 - movff EEDATA,desaturation_time+1 + movff EEDATA,int_O_desaturation_time+1 read_int_eeprom .11 movff EEDATA,surface_interval+0 read_int_eeprom .12 movff EEDATA,surface_interval+1 read_int_eeprom .13 - movff EEDATA,char_O_gradient_factor + movff EEDATA,int_O_gradient_factor+0 read_int_eeprom .14 - movff EEDATA,nofly_time+0 + movff EEDATA,int_O_nofly_time+0 read_int_eeprom .15 - movff EEDATA,nofly_time+1 + movff EEDATA,int_O_nofly_time+1 ; Tissue data from 16 to 144 movlw .16 movwf EEADR movlw .128 movwf lo - lfsr FSR1,0x700;pres_tissue_N2+0 ; 32*4Byte Float = 128Bytes + lfsr FSR1,0x700;pres_tissue_N2+0 ; 32*4Byte Float = 128Bytes restore_decodata_from_eeprom2: - call read_eeprom ; EEPROM@EEADR into EEDATA + call read_eeprom ; EEPROM@EEADR into EEDATA movff EEDATA,POSTINC1 incf EEADR,F - decfsz lo,F ; All done? + decfsz lo,F ; All done? bra restore_decodata_from_eeprom2 ; No clrf EEADRH return
--- a/src/hwos.inc Wed Dec 27 14:34:11 2017 +0100 +++ b/src/hwos.inc Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File hwos.inc +; File hwos.inc REFACTORED VERSION V2.95a1 ; ; OSTC Platform definitions ; @@ -15,19 +15,20 @@ ;#DEFINE __DEBUG -;#DEFINE french_italian ; If defined, use french and italian instead of english and german +;#DEFINE french_italian ; If defined, use french and italian instead of english and german #include <p18f87k22.inc> #include <ports.inc> ; Portmap ; Firmware definition #DEFINE softwareversion_x d'2' ; Software version XX.YY -#DEFINE softwareversion_y d'27' ; Software version XX.YY -#DEFINE softwareversion_beta 0 ; (and 0 for release) +#DEFINE softwareversion_y d'96' ; Software version XX.YY +#DEFINE softwareversion_beta 1 ; (and 0 for release) + ; Firmware version will appear in "Change Firmware" style #DEFINE firmware_expire_year .18 -#DEFINE firmware_expire_month .12 -#DEFINE firmware_expire_day .3 +#DEFINE firmware_expire_month .2 +#DEFINE firmware_expire_day .22 #DEFINE comm_service_key 0xABCDEF @@ -46,10 +47,10 @@ #DEFINE TMR1H_VALUE_CONT_DIVE .255-.64 ; in steps of 7,8125ms -> 0.5s ; Color Definitions: 8Bit RGB b'RRRGGGBB' -#DEFINE color_red b'11100000' ; (7,0,0) +#DEFINE color_red b'11100000' ; (7,0,0) #DEFINE color_dark_red b'10000101' ; (4,1,1) -#DEFINE color_violet b'11101011' ; (7,2,3) -#DEFINE color_blue b'11000111' ; (6,1,3) +#DEFINE color_violet b'11101011' ; (7,2,3) +#DEFINE color_blue b'11000111' ; (6,1,3) #DEFINE color_green b'00011100' ; (0,7,0) #DEFINE color_greenish b'00111110' ; (1,7,2) #DEFINE color_dark_green b'00111001' ; (1,6,1) @@ -74,8 +75,9 @@ #DEFINE warn_ppo2 .4 #DEFINE warn_ceiling .5 #DEFINE warn_gas_in_gaslist .6 -#DEFINE warn_ppo2_hud .7 +#DEFINE warn_ppo2_hud .7 #DEFINE warn_battery .8 +#DEFINE warn_stop .9 ; External O2 cell input parameters #DEFINE min_mv .80 ; = 8mV @@ -85,6 +87,7 @@ ; Profile recording parameters #DEFINE logbook_profile_version 0x24 #DEFINE samplingrate_apnoe .1 ; [seconds] + ; Warning: Divisors must be <.16 ! #DEFINE div_temperature .6 ; x samplingrate [s] #DEFINE div_deco .6 ; x samplingrate [s] @@ -93,6 +96,7 @@ #DEFINE div_decoplan .12 ; x samplingrate [s] #DEFINE div_cns .12 ; x samplingrate [s] #DEFINE div_tank .0 ; x samplingrate [s] + ; Warning: Information lengths must be <.16 ! #DEFINE infolength_temperature .2 ; [byte] #DEFINE infolength_deco .2 ; [byte] @@ -110,29 +114,36 @@ #DEFINE better_gas_window_pos .1 ; [m] (Depth below change depth, if ppO2<opt_ppO2_max) ; Dive mode limits and thresholds -#DEFINE start_dive_threshold .100 ; [cm] -#DEFINE high_altitude_dive_threshold .300;[cm] -#DEFINE apnoe_timeout .15 ; [min] -#DEFINE divemode_menuview_timeout .10 ; [s] -#DEFINE divemode_timeout_default .5 ; [min] -#DEFINE divemode_menu_timeout .30 ; [s] -#DEFINE ppo2_warning_low .19 ; [cbar] (Default value) -#DEFINE ppo2_lowest_setting .16 ; [cbar] (Minimum value) -#DEFINE ppo2_display_high .120 ; [cbar] -#DEFINE ppo2_warning_high .160 ; [cbar] (Default value) for bottom/travel gases +#DEFINE start_dive_threshold .100 ; [cm] +#DEFINE high_altitude_dive_threshold .300 ; [cm] +#DEFINE apnoe_timeout .15 ; [min] +#DEFINE divemode_menuview_timeout .10 ; [s] +#DEFINE divemode_timeout_default .5 ; [min] +#DEFINE divemode_menu_timeout .30 ; [s] + +#DEFINE ppo2_warning_low .19 ; [cbar] (Default value) +#DEFINE ppo2_lowest_setting .16 ; [cbar] (Minimum value) +;#DEFINE ppo2_display_high .120 ; [cbar] ## V2.94 moved to p2_deco.c +#DEFINE ppo2_warning_high .160 ; [cbar] (Default value) for bottom/travel gases #DEFINE ppo2_warning_high_deco .160 ; [cbar] (Default value) for deco gases -#DEFINE ppo2_highest_setting .160 ; [cbar] (Max. Value) for bottom/travel gases -#DEFINE ppo2_highest_setting_deco .160 ; [cbar] (Max. Value) for deco gases -#DEFINE cns_display_high .70 ; [%] -#DEFINE cns_warning_high .100 ; [%] -#DEFINE gf_display_high .75 ; [%] -#DEFINE gf_warning_high .100 ; [%] +#DEFINE ppo2_highest_setting .160 ; [cbar] (Max. Value) for bottom/travel gases +#DEFINE ppo2_highest_setting_deco .160 ; [cbar] (Max. Value) for deco gases + +; NEW ## min ppO2 CC +#DEFINE ppo2_warning_low_cc .40 ; [cbar] Default value for loop +#DEFINE ppo2_warning_low_cc_min .20 ; [cbar] Default value for loop +#DEFINE ppo2_warning_low_cc_max .60 ; [cbar] Default value for loop + +;#DEFINE cns_display_high .70 ; [%] ## V2.94 moved to p2_deco.c +;#DEFINE cns_warning_high .100 ; [%] ## V2.94 moved to p2_deco.c +;#DEFINE gf_display_high .75 ; [%] ## V2.94 moved to p2_deco.c +;#DEFINE gf_warning_high .100 ; [%] ## V2.94 moved to p2_deco.c #DEFINE depth_warn_mbar .13000 ; [mbar] #DEFINE wake_up_from_sleep .1160 ; [mbar] #DEFINE gf_display_threshold .20 ; [%] #DEFINE simulator_timeout .15 ; [s] -#DEFINE sensor_voting_logic_threshold .20 ; Threshold in 0.01bar +#DEFINE sensor_voting_logic_threshold .10 ; Threshold in 0.01bar ; Surface mode limits and thresholds #DEFINE cns_display_surface_high .70 ; [%] @@ -143,14 +154,13 @@ #DEFINE timeout_ccr_surface .240 ; [s] ; Decomodel paramters -#DEFINE no_fly_time_ratio .60 ; [%] #DEFINE deco_distance .10 ; [dm] ; Color-code parameters for the divemode -#DEFINE color_code_cns_high .100 ; [%] -#DEFINE color_code_gf_warn_high .101 ; [%] -#DEFINE color_code_velocity_warn_high .11 ;[m/min] -#DEFINE color_code_velocity_attn_high .10 ;[m/min] +;#DEFINE color_code_cns_high .100 ; [%] ## V2.94 moved to p2_deco.c +;#DEFINE color_code_gf_warn_high .101 ; [%] ## V2.94 moved to p2_deco.c +#DEFINE color_code_velocity_warn_high .11 ;[m/min] +#DEFINE color_code_velocity_attn_high .10 ;[m/min] ; Velocity threshold #DEFINE velocity_display_threshold_1 .3 ; [m/min] @@ -172,7 +182,7 @@ ; Capacity for 2.4Ah Saft LS14500 and 0.8Ah Panasonic UR14500P ; battery_gauge:6 is nAs ; devide through 65536 -; a) devide through 364 -> Result is in percent of a 2.4Ah Battery +; a) devide through 364 -> Result is in percent of a 2.4Ah Battery ; or b) devide through 121 -> Result is in percent of a 0.8Ah Battery ; For internal battery gauging @@ -181,9 +191,9 @@ ; For gauge IC #DEFINE saft_capacity .281 ; 2.4Ah/0.085mAh/100 [%] -#DEFINE saft_offset .37300 ; 65536-(2.4Ah/0.085mAh) +#DEFINE saft_offset .37300 ; 65536-(2.4Ah/0.085mAh) -#DEFINE panasonic_capacity .94 ; 0.8Ah/0.085mAh/100 [%] +#DEFINE panasonic_capacity .94 ; 0.8Ah/0.085mAh/100 [%] #DEFINE panasonic_offset .56124 ; 65536-(0.8Ah/0.085mAh) #DEFINE ncr18650_capacity .364 ; 3.1Ah/0.085mAh/100 [%] @@ -229,12 +239,12 @@ #DEFINE compass_averaging .10 ; numbers of extra averaging ; Hardware defines -#DEFINE battery_gauge_available hardware_flag,0 ; OSTC has rechargeable battery with battery management chip -#DEFINE ambient_sensor hardware_flag,1 ; OSTC has an ambient sensor -#DEFINE analog_o2_input hardware_flag,2 ; OSTC has analog inputs and S8 digital -#DEFINE optical_input hardware_flag,3 ; OSTC has an digital optical input -#DEFINE ble_available hardware_flag,4 ; OSTC has an BLE module -;unused +#DEFINE battery_gauge_available hardware_flag,0 ; OSTC has rechargeable battery with battery management chip +#DEFINE ambient_sensor hardware_flag,1 ; OSTC has an ambient sensor +#DEFINE analog_o2_input hardware_flag,2 ; OSTC has analog inputs and S8 digital +#DEFINE optical_input hardware_flag,3 ; OSTC has an digital optical input +#DEFINE ble_available hardware_flag,4 ; OSTC has an BLE module +#DEFINE ostc_rx_present hardware_flag,5 ; OSTC_RX circuity present ;unused ;unused @@ -251,56 +261,56 @@ isr_backup udata_ovr isr_backup ; Reserved space for interupt data ;---- Backup for general registers -isr_prod res 2 +isr_prod res 2 ;---- MS5541 subroutines -amb_pressure res 2 -temperature res 2 +amb_pressure res 2 +temperature res 2 -C1 res 2 ; Decoded calibration data -C2 res 2 -C3 res 2 -C4 res 2 ; Here: C4-250 -C5 res 2 ; Here: Reference Temperature UT1 = 8*C5 + 10000 (u16 range 10.000 .. +42.760) -C6 res 2 -D1 res 2 ; raw pressure -D2 res 2 ; raw temperature -xdT res 2 -xdT2 res 2 -OFF res 2 -SENS res 2 -dLSB res 1 ;Pressure sensor interface -dMSB res 1 -clock_count res 1 -sensor_state_counter res 1 ; counts to eight for state maschine -amb_pressure_avg res 2 -temperature_avg res 2 -minimum_temperature res 2 ; minimum temperature -last_temperature res 2 -last_pressure res 2 +C1 res 2 ; Decoded calibration data +C2 res 2 +C3 res 2 +C4 res 2 ; Here: C4-250 +C5 res 2 ; Here: Reference Temperature UT1 = 8*C5 + 10000 (u16 range 10.000 .. +42.760) +C6 res 2 +D1 res 2 ; raw pressure +D2 res 2 ; raw temperature +xdT res 2 +xdT2 res 2 +OFF res 2 +SENS res 2 +dLSB res 1 ; Pressure sensor interface +dMSB res 1 +clock_count res 1 +sensor_state_counter res 1 ; counts to eight for state maschine +amb_pressure_avg res 2 +temperature_avg res 2 +minimum_temperature res 2 ; minimum temperature +last_temperature res 2 +last_pressure res 2 last_pressure_velocity res 2 ; For velocity -last_surfpressure res 2 +last_surfpressure res 2 last_surfpressure_15min res 2 last_surfpressure_30min res 2 -rel_pressure res 2 -sim_pressure res 2 ; hold simulated pressure in mbar if in Simulator mode -max_pressure res 2 -avg_rel_pressure res 2 -avg_rel_pressure_total res 2 +rel_pressure res 2 +sim_pressure res 2 ; hold simulated pressure in mbar if in Simulator mode +max_pressure res 2 +avg_rel_pressure res 2 +avg_rel_pressure_total res 2 ;---- Data for ISR math subroutines -isr_xC res 4 -isr_xA res 2 -isr_xB res 2 +isr_xC res 4 +isr_xA res 2 +isr_xB res 2 ;---- Data for ISR routines -isr1_temp res 1 ; ISR temp variable, used in ms5541.asm, isr_rtcc, isr_battery_gauge -isr2_temp res 1 ; ISR temp variable, used isr_battery_gauge +isr1_temp res 1 ; ISR temp variable, used in ms5541.asm, isr_rtcc, isr_battery_gauge +isr2_temp res 1 ; ISR temp variable, used isr_battery_gauge ;---- Display brightness -max_CCPR1L res 1 ; Max. brightness value for CCPR1L +max_CCPR1L res 1 ; Max. brightness value for CCPR1L ; Battery gauge (nAs, nC) -battery_gauge res 6 ; 48Bit -> 78Ah max... +battery_gauge res 6 ; 48Bit -> 78Ah max... ; IR/S8-Link ir_s8_buffer res .18 ; temporally used in get_calibration_data for the raw (packed) calibration data @@ -334,8 +344,8 @@ compass_heading res 2 ; Corrected heading (in 1°) : -180 .. 180 compass_heading_old res 2 ; Old heading (For smoother display) compass_heading_shown res 2 ; Displayed heading -;compass_roll res 2 ; Rotation around the X axis -;compass_pitch res 2 ; Rotation around the Y axis +;compass_roll res 2 ; Rotation around the X axis +;compass_pitch res 2 ; Rotation around the Y axis compass_a res 2 ; Tmp data for Q15 arithmetics compass_b res 2 @@ -344,16 +354,16 @@ CNS_start res 2 ; CNS value at beginning of dive GF_start res 1 ; GF value at beginning of dive -speed_setting res 1 ; =1: Eco, =2: Normal, =3: Fastest +speed_setting res 1 ; =1: Eco, =2: Normal, =3: Fastest ;---- Data for graphical compass -xRD res 2 ; virtual compass ruler offset -xRDr res 2 ; virtual compass ruler offset - right end -xRD180 res 2 ; virtual compass ruler offset for the -180 marker -xLO res 1 ; lo backup to prevent trashing -xHI res 1 ; hi backup to prevent trashing -xCM res 1 ; compass bearing relative position -compass_bearing res 2 ; this is where the bearing menu stores the actual heading for bearing +xRD res 2 ; virtual compass ruler offset +xRDr res 2 ; virtual compass ruler offset - right end +xRD180 res 2 ; virtual compass ruler offset for the -180 marker +xLO res 1 ; lo backup to prevent trashing +xHI res 1 ; hi backup to prevent trashing +xCM res 1 ; compass bearing relative position +compass_bearing res 2 ; this is where the bearing menu stores the actual heading for bearing ;---------------------------- Common DATA ------------------------------------ @@ -361,30 +371,30 @@ common udata_ovr common ; Bank1 general variables ;---- Time and Date -secs res 1 -mins res 1 -hours res 1 -day res 1 -month res 1 -year res 1 +secs res 1 +mins res 1 +hours res 1 +day res 1 +month res 1 +year res 1 surface_interval res 2 -flag1 res 1 -flag2 res 1 -flag3 res 1 -flag4 res 1 -flag5 res 1 -flag6 res 1 -flag7 res 1 -flag8 res 1 -flag9 res 1 -flag10 res 1 -flag11 res 1 -flag12 res 1 -flag13 res 1 -flag14 res 1 +flag1 res 1 +flag2 res 1 +flag3 res 1 +flag4 res 1 +flag5 res 1 +flag6 res 1 +flag7 res 1 +flag8 res 1 +flag9 res 1 +flag10 res 1 +flag11 res 1 +flag12 res 1 +flag13 res 1 +flag14 res 1 -hardware_flag res 1 ; hardware descriptor flag +hardware_flag res 1 ; hardware descriptor flag temp1 res 1 temp2 res 1 @@ -430,7 +440,7 @@ sub_b res 2 ;---- Data for conversion subroutines -cvt_flags res 1 +cvt_flags res 2 ignore_digits res 1 #define leftbind cvt_flags,0 @@ -441,8 +451,11 @@ #DEFINE screen_type cvt_flags,5 ; =1: display1, =0; display0 #DEFINE compass_type cvt_flags,6 ; =1: compass1, =0: compass0 #DEFINE analog_switches cvt_flags,7 ; =1: Analog switches available + +#DEFINE compass_type2 cvt_flags+1,0 ; =1: Compass2, =0: Compass1 or compass0 + + ;---- Misc. -nofly_time res 2 ; No Fly time in Minutes (Calculated after Dive) timeout_counter res 1 timeout_counter2 res 1 timeout_counter3 res 1 @@ -451,12 +464,10 @@ ambient_light res 2 ; ambient_light level lo_temp res 1 hi_temp res 1 -desaturation_time res 2 convert_value_temp res 3 ; used in menu_battery_state_convert_date -active_gas res 1 -active_diluent res 1 ; As a backup when switching back from Bailout to CCR +active_gas res 1 ; the currently breathed gas (1-5) +active_diluent res 1 ; backup when switching back from bailout to CCR/pSCR loop warning_counter res 1 ; Counts amount of warning in divemode -warning_counter_backup res 1 ; Backup of warning_counter warning_page res 1 ; current # of warning page ; Remind history for menu processor (and such): @@ -493,11 +504,11 @@ apnoe_surface_secs res 1 ; Profile storing -AlarmType res 1 -samplesecs res 1 -EventByte res 1 -EventByte2 res 1 -ProfileFlagByte res 1 +AlarmType res 1 +samplesecs res 1 +EventByte res 1 +EventByte2 res 1 +ProfileFlagByte res 1 ; External flash ext_flash_address res 3 ; 24bit Address @@ -525,12 +536,16 @@ ;Bit6 unused in stand-alone HUD ;Bit7 unused in stand-alone HUD -sensor_setpoint res 1 ; sensor ppo2 in 0.01bar for deco routine +sensor_setpoint res 1 ; sensor ppo2 in 0.01bar for deco routine better_gas_number res 1 ; number (1-5) of the "better gas" in divemode, =0: no better gas available -customview_divemode res 1 ; keeps last custom view -customview_surfmode res 1 -safety_stop_countdown res 1 ; counts seconds of safety stop +customview_divemode res 1 ; keeps last custom view +customview_surfmode res 1 +safety_stop_countdown res 1 ; counts seconds of safety stop +tft_update_flags res 3 ; probably more then needed... + +; bank common 1 Byte left here... + ;---------------------------- TMP DATA --------------------------------------- ; Space for various overlayed data from color, word, menu processors, etc. @@ -545,42 +560,50 @@ common2 equ 0xA00 ; Alias for "banksel common" common2 udata_ovr common2 ; Bank1 general variables -s8_rawdata_sensor1 res 3 ; 24bit A/D raw data from S8 HUD sensor 1 -s8_rawdata_sensor2 res 3 ; 24bit A/D raw data from S8 HUD sensor 2 -s8_rawdata_sensor3 res 3 ; 24bit A/D raw data from S8 HUD sensor 3 +s8_rawdata_sensor1 res 3 ; 24bit A/D raw data from S8 HUD sensor 1 +s8_rawdata_sensor2 res 3 ; 24bit A/D raw data from S8 HUD sensor 2 +s8_rawdata_sensor3 res 3 ; 24bit A/D raw data from S8 HUD sensor 3 -hud_battery_mv res 2 ; hud/ppo2 monitor battery voltage in mV -start_day res 1 ; At start of dive (For logbook) -start_month res 1 ; At start of dive (For logbook) -start_year res 1 ; At start of dive (For logbook) -start_hours res 1 ; At start of dive (For logbook) -start_mins res 1 ; At start of dive (For logbook) +hud_battery_mv res 2 ; hud/ppo2 monitor battery voltage in mV +start_day res 1 ; At start of dive (For logbook) +start_month res 1 ; At start of dive (For logbook) +start_year res 1 ; At start of dive (For logbook) +start_hours res 1 ; At start of dive (For logbook) +start_mins res 1 ; At start of dive (For logbook) -old_velocity res 4 ; Stores the last 4 speeds (8 seconds) in m/min -opt_gas_type_backup res 5 ; 0=Disabled, 1=First, 2=Travel, 3=Deco -opt_dil_type_backup res 5 ; 0=Disabled, 1=First, 2=Normal -opt_OC_bail_gas_change_backup res 5 ; Gas change depths OC/Bailout -opt_dil_change_backup res 5; Gas change depths Diluents +old_velocity res 4 ; Stores the last 4 speeds (8 seconds) in m/min +opt_gas_type_backup res 5 ; 0=Disabled, 1=First, 2=Travel, 3=Deco +opt_dil_type_backup res 5 ; 0=Disabled, 1=First, 2=Normal + +opt_OC_bail_gas_change_backup res 5 ; Gas change depths OC/Bailout +opt_dil_change_backup res 5 ; Gas change depths Diluents internal_battery_capacity res 2 ; For internal battery gauging -battery_capacity res 2 ; For battery gauge IC -battery_offset res 2 ; For battery gauge IC +battery_capacity res 2 ; For battery gauge IC +battery_offset res 2 ; For battery gauge IC -analog_sw1_raw res 2 ; idle values (average) -analog_sw2_raw res 2 ; idle values (average) -analog_counter res 1 ; for averaging -analog_sw1 res 1 ; analog value for switch 1 -analog_sw2 res 1 ; analog value for switch 2 -battery_type res 1 ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah -uptime res 4 ; Uptime [s] -lastdive_time res 4 ; Time since last dive [s] -lastdive_duration res 3 ; mins:2 and secs -lastdive_maxdepth res 2 ; in mbar +analog_sw1_raw res 2 ; idle values (average) +analog_sw2_raw res 2 ; idle values (average) +analog_counter res 1 ; for averaging +analog_sw1 res 1 ; analog value for switch 1 +analog_sw2 res 1 ; analog value for switch 2 +battery_type res 1 ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah +uptime res 4 ; Uptime [s] +lastdive_time res 4 ; Time since last dive [s] +lastdive_duration res 3 ; mins:2 and secs +lastdive_maxdepth res 2 ; in mbar battery_acumulated_charge res 2 ; Raw values in battery gauge IC -gauge_status_byte res 1 ; Gauge IC status byte -button_polarity res 1 ; 0xFF (Both normal), 0x00 (Both inverted), 0x01 (Left inverted only), 0x02 (Right inverted only) -gaslist_gas_global res 1 ; for color coding the gas lists -active_gas_type res 1 ; 0=Disabled, 1=First, 2=Travel, 3=Deco for OC gases and 0=Disabled, 1=First, 2=Normal for diluents +gauge_status_byte res 1 ; Gauge IC status byte +button_polarity res 1 ; 0xFF (Both normal), 0x00 (Both inverted), 0x01 (Left inverted only), 0x02 (Right inverted only) +gaslist_gas_global res 1 ; for color coding the gas lists +;active_gas_type res 1 ; 0=Disabled, 1=First, 2=Travel, 3=Deco for OC gases and 0=Disabled, 1=First, 2=Normal for diluents +rx_buffer res .48 ; Buffer for RX data (Slots 0-7) +rx_firmware res 2 ; The RX firmware version xx.yy + +gas6_O2_ratio res 1 ; gas6 O2 ratio +gas6_He_ratio res 1 ; gas6 He ratio +gas6_temp res 1 ; temp used in divemenu_tree.asm + ;----------------------------------------------------------------------------- ; Reserve BANK2 for general purpose buffer (strings, images, etc). @@ -599,12 +622,10 @@ opt_gas_type res 5 ; 0=Disabled, 1=First, 2=Travel, 3=Deco opt_dil_type res 5 ; 0=Disabled, 1=First, 2=Normal -> ; Must be in line with opt_gas_type opt_dive_mode res 1 ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR -opt_ppO2_max res 1 ; PPO2 Max for MOD calculation and color coding in divemode opt_ccr_mode res 1 ; =0: Fixed SP, =1: Sensor -opt_ppO2_min res 1 ; PPO2 min for Sensors and color coding in divemode opt_OC_bail_gas_change res 5 ; Gas change depths OC/Bailout + ;---- Managing Settings - opt_brightness res 1 ; =0: Eco, =1:Medium, =2:Full opt_salinity res 1 ; 0-5% #DEFINE opt_name_length .60 ; Custom text string 5 rows with 12 chars @@ -627,7 +648,7 @@ opt_x_s1 res 2 ; calibration factor (Not stored in EEPROM) opt_x_s2 res 2 ; calibration factor (Not stored in EEPROM) opt_x_s3 res 2 ; calibration factor (Not stored in EEPROM) -opt_sensor_fallback res 1 ; =1: Fallback to SP1 when sensor is lost +opt_sensor_fallback res 1 ; NOT USED ANY MORE, KEPT FOR COMPATIBILITY WITH EEPROM IMAGE opt_flip_screen res 1 ; =1: Flip the screen opt_cR_button_left res 1 ; Left button sensitivity (cR hardware) opt_cR_button_right res 1 ; Right button sensitivity (cR hardware) @@ -640,20 +661,21 @@ opt_safety_stop_start res 1 ; [cbar] opt_safety_stop_end res 1 ; [cbar] opt_safety_stop_reset res 1 ; [cbar] -opt_diveTimeout res 1 ; Timeout for Divemode [min] -opt_PSCR_drop res 1 ; PSCR Drop [%] -opt_PSCR_lungratio res 1 ; PSCR Lung Ratio [1/x] -opt_ppO2_max_deco res 1 ; PPO2 Max Decogases (for MOD calculation and color coding in divemode) +opt_diveTimeout res 1 ; Timeout for Divemode [min] +opt_sim_setpoint_number res 1 ; NEW setpoint to use for deco calculation +opt_calc_asc_gasvolume res 1 ; NEW calculate OC gas volume needs for ascent +opt_sim_use_aGF res 1 ; NEW use GF (no) or aGF (yes) for deco calculation +opt_enable_IBCD res 1 ; NEW enable IBCD warning ;-----------------------------EEPROM DATA ------------------------------------ ; Automatic reset of all options when this is changed: -#define eeprom_opt_serial 0x0005 ; Version 0.5 +#define eeprom_opt_serial 0x0006 ; Version 0.6 ;----------------------------------------------------------------------------- ; Flags #DEFINE switch_left flag1,0 #DEFINE switch_right flag1,1 -#DEFINE neg_flag flag1,2 ; e.g. sub16 (sub_c = sub_a - sub_b) +#DEFINE neg_flag flag1,2 ; e.g. sub16 (sub_c = sub_a - sub_b) #DEFINE pressure_refresh flag1,3 ; =1: A new pressure/temperature is available #DEFINE sleepmode flag1,4 ; =1: In Sleepmode #DEFINE tft_is_dimming flag1,5 ; =1: The TFT is dimming, ignore light sensor @@ -666,14 +688,14 @@ #DEFINE FLAG_apnoe_mode flag2,3 ; =1: Apnoe mode selected #DEFINE restore_deco_data flag2,4 ; =1: Restore deco data (After simulation) #DEFINE premenu flag2,5 ; =1: Premenu/Divemenu selected -#DEFINE menubit flag2,6 ; menu +#DEFINE menubit flag2,6 ; menu #DEFINE simulatormode_active flag2,7 ; =1: Simulator mode active, override pressure sensor readings #DEFINE divemode_menu flag3,0 ; =1: Divemode menu is shown -#DEFINE onesecupdate flag3,1 ; =1 after any second +#DEFINE onesecupdate flag3,1 ; =1: after any second #DEFINE twosecupdate flag3,2 ; =1: New two-second update #DEFINE toggle_customview flag3,3 ; =1: Next customview -#DEFINE oneminupdate flag3,4 ; =1 after any minute +#DEFINE oneminupdate flag3,4 ; =1: after any minute #DEFINE divemode flag3,5 ; =1: in Divemode #DEFINE battery_is_36v flag3,6 ; =1: 3,6V Battery is in use #DEFINE warning_active flag3,7 ; =1: A warning is active in divemode or surfacemode @@ -691,7 +713,7 @@ #DEFINE reset_average_depth flag5,1 ; =1: Reset the average depth #DEFINE store_sample flag5,2 ; =1: Store a new sample #DEFINE divemode2 flag5,3 ; =1: Dive longer then one minute -#DEFINE FLAG_active_descent flag5,4 ; Used in Apnoe mode +#DEFINE FLAG_active_descent flag5,4 ; Used in Apnoe mode #DEFINE event_occured flag5,5 ; =1: An event occured, store it! #DEFINE divemode_menu_active flag5,6 ; =1: The divemode menu is shown #DEFINE temp_changed flag5,7 ; =1: The temperature changed @@ -708,9 +730,9 @@ #DEFINE dive_hud3_displayed flag7,0 ; =1: The Sensor3 HUD reading is displayed #DEFINE no_more_divesecs flag7,1 ; =1: Do no longer show seconds in divemode #DEFINE FLAG_gauge_mode flag7,2 ; =1: In Gauge mode -#DEFINE ignore_last_edited_gas flag7,3 ; Used in gaslist_cleanup_list +#DEFINE ignore_last_edited_gas flag7,3 ; Used in gaslist_cleanup_list #DEFINE ccr_diluent_setup flag7,4 ; =1: Setting up Diluents ("Gas6-10") -#DEFINE menu_show_sensors flag7,5 ; =1: Update HUD data in menu +#DEFINE menu_show_sensors flag7,5 ; =1: Update HUD data in menu ## NOT USED ANYMORE ## #DEFINE short_gas_decriptions flag7,6 ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint #DEFINE max_depth_greater_100m flag7,7 ; =1: Max. Depth > 100m @@ -727,7 +749,7 @@ #DEFINE in_color_menu flag9,1 ; =1: In the color scheme menu #DEFINE bailoutgas_event flag9,2 ; =1: bailout was selected or a gaschange during bailout #DEFINE win_invert flag9,3 ; =1: Invert font output -#DEFINE show_safety_stop flag9,4 ; =1: Show the safety stop +#DEFINE show_safety_stop flag9,4 ; =1: Show the safety stop #DEFINE safety_stop_active flag9,5 ; =1: The safety stop is currently displayed #DEFINE new_s8_data_available flag9,6 ; =1: New data frame recieved #DEFINE print_compass_label flag9,7 ; =1: print the graphical comapss label @@ -760,28 +782,106 @@ #DEFINE blinking_depth_toggle flag12,7 ; toggle to blink #DEFINE neg_flag_velocity flag13,0 ; neg_flag backup for velocity logic -#DEFINE analog_sw1_pressed flag13,1 ; =1: Analog switch 1 pressed -#DEFINE analog_sw2_pressed flag13,2 ; =1: Analog switch 2 pressed +#DEFINE analog_sw1_pressed flag13,1 ; =1: Analog switch 1 pressed +#DEFINE analog_sw2_pressed flag13,2 ; =1: Analog switch 2 pressed #DEFINE sp2_switched flag13,3 ; =1: This setpoint has been autoselected already #DEFINE sp3_switched flag13,4 ; =1: This setpoint has been autoselected already #DEFINE sp4_switched flag13,5 ; =1: This setpoint has been autoselected already #DEFINE sp5_switched flag13,6 ; =1: This setpoint has been autoselected already -#DEFINE use_old_batt_flag flag13,7 ; =1: load old battery information after power-on reset +#DEFINE use_old_batt_flag flag13,7 ; =1: load old battery information after power-on reset -#DEFINE FLAG_pscr_mode flag14,0 ; =1: OSTC is in PSCR mode -#DEFINE deep_sleep flag14,1 ; OSTC is in deep sleep (ignore buttons, etc) +#DEFINE FLAG_pscr_mode flag14,0 ; =1: OSTC is in PSCR mode +#DEFINE deep_sleep flag14,1 ; OSTC is in deep sleep (ignore buttons, etc) +#DEFINE sensors_agree flag14,2 ; =1: the ppO2 of all sensors are within the threshold range +#DEFINE gas_needs_attention flag14,3 ; =1: the gas needs attention has been raised before +#DEFINE gas_needs_warning flag14,4 ; =1: the gas needs warning has been raised before +#DEFINE sensor_warning flag14,5 ; =1: the sensors disagree warning has been raised before +#DEFINE alternative_divelayout flag14,6 ; =1: the alternative divelayout is used (aka Blind Mode) +#DEFINE i2c_error_flag flag14,7 ; =1: An I2C error occured + + +; Update flags in divemode, =1: Update the screen +#DEFINE FLAG_TFT_divemode_mask tft_update_flags+0,0 +#DEFINE FLAG_TFT_display_ndl_mask tft_update_flags+0,1 +#DEFINE FLAG_TFT_depth tft_update_flags+0,2 +#DEFINE FLAG_TFT_divemins tft_update_flags+0,3 +#DEFINE FLAG_TFT_show_safety_stop tft_update_flags+0,4 +#DEFINE FLAG_TFT_display_ndl tft_update_flags+0,5 +#DEFINE FLAG_TFT_display_deko_mask tft_update_flags+0,6 +#DEFINE FLAG_TFT_display_deko tft_update_flags+0,7 +#DEFINE FLAG_TFT_display_tts tft_update_flags+1,0 +#DEFINE FLAG_TFT_temp_divemode tft_update_flags+1,1 +#DEFINE FLAG_TFT_divemode_warning tft_update_flags+1,2 +#DEFINE FLAG_TFT_divemode_warning_clear tft_update_flags+1,3 +#DEFINE FLAG_TFT_active_gas_divemode tft_update_flags+1,4 +#DEFINE FLAG_TFT_clear_safety_stop tft_update_flags+1,5 +#DEFINE FLAG_TFT_max_depth tft_update_flags+1,6 +#DEFINE FLAG_TFT_divemode_mask_alt tft_update_flags+1,7 +#DEFINE FLAG_TFT_dive_warning_text_clear tft_update_flags+2,0 +#DEFINE FLAG_TFT_dive_warning_text_clr2 tft_update_flags+2,1 +#DEFINE FLAG_TFT_max_depth_alt tft_update_flags+2,2 +#DEFINE FLAG_TFT_big_deco_alt tft_update_flags+2,3 +#define FLAG_TFT_not_defined_yet tft_update_flags+2,7 ; last usable flag within tft_update_flags memory space + + +; Bit Masks for communication with p2_deco.c +#define DECO_STATUS_MASK .3 + +; Bit Flags for communication with p2_deco.c - char_O_deco_status +#define DECO_STATUS_0_FLAG .0 +#define DECO_STATUS_1_FLAG .1 +#define DECO_MODE_LOOP_FLAG .2 +#define DECO_MODE_PSCR_FLAG .3 +#define DECO_PLAN_FLAG .4 +#define DECO_CNS_FLAG .5 +#define DECO_VOLUME_FLAG .6 +#define DECO_ASCENT_FLAG .7 + +; Bit Flags for communication with p2_deco.c - char_O_main_status +;#define DECO_MODE_LOOP_FLAG .2 +;#define DECO_MODE_PSCR_FLAG .3 +#define DECO_GASCHANGE_OVRD .4 +#define DECO_BOTTOM_FLAG .6 + +; Bit Values for communication with p2_deco.c +#define DECO_STATUS_INIT .3 +#define DECO_MODE_LOOP .4 +#define DECO_MODE_PSCR .8 +#define DECO_PLAN_ALTERNATE .16 +#define DECO_CNS_CALCULATE .32 +#define DECO_VOLUME_CALCULATE .64 +#define DECO_ASCENT_DELAYED .128 + +; Bit Flags for char_O_deco_warnings +#define IBCD_warning .0 +#define IBCD_warning_lock .1 +#define mbubble_warning .2 +#define mbubble_warning_lock .3 +#define outside_warning .4 +#define outside_warning_lock .5 +#define stoptable_overflow .6 +#define deco_flag .7 + +#define char_invalid_flag .7 + +#define int_invalid_flag .2 +#define int_not_yet_computed .3 +#define int_is_zero .3 +#define int_low_flag .4 +#define int_high_flag .5 +#define int_prewarning_flag .6 +#define int_warning_flag .7 + + + ;============================================================================= ; C-code Routines ; PART 2 extern deco_calc_CNS_decrease_15min - extern deco_calc_CNS_fraction extern deco_calc_desaturation_time extern deco_calc_hauptroutine - extern deco_calc_tissue - extern deco_calc_percentage extern deco_calc_wo_deco_step_1_min extern deco_calc_dive_interval - extern deco_clear_CNS_fraction extern deco_clear_tissue extern deco_pull_tissues_from_vault extern deco_push_tissues_to_vault
--- a/src/i2c.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/i2c.asm Wed Jan 31 19:39:37 2018 +0100 @@ -2,17 +2,29 @@ ; ; File i2c.asm ; -; I2C Interface to HMC5883L and MMA8452Q -; +; I2C Interface +; + ; Compass0 ; HMC5883L's read address (8-Bit): 0x3D ; HMC5883L's write address (8-Bit): 0x3C -; ; MMA8452Q's read address (8-Bit): 0x39 ; MMA8452Q's write address (8-Bit): 0x38 ; + ; Compass1 ; LSM303D's read address (8-Bit): 0x3D ; LSM303D's write address (8-Bit): 0x3C ; + ; Compass2 +; LSM303AGR's Compass read address (8-Bit): 0x3D +; LSM303AGR's Compass write address (8-Bit): 0x3C +; LSM303AGR's Acceleration read address (8-Bit): 0x33 +; LSM303AGR's Acceleration write address (8-Bit): 0x32 +; + ; RX Circuity +; RX Circuity read address (8-Bit): 0x51 +; RX Circuity write address (8-Bit): 0x50 +; +; ; Copyright (c) 2012, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; HISTORY @@ -22,28 +34,29 @@ #include "hwos.inc" ; Mandatory header #include "wait.inc" #include "math.inc" +#include "external_flash.inc" i2c CODE WaitMSSP: decfsz i2c_temp,F ; check for timeout during I2C action - bra WaitMSSP2 - bra I2CFail ; timeout occured + bra WaitMSSP2 + bra I2CFail ; timeout occured WaitMSSP2: - btfss PIR1,SSPIF - bra WaitMSSP + btfss PIR1,SSP1IF + bra WaitMSSP clrf i2c_temp - bcf PIR1,SSPIF - nop + bcf PIR1,SSP1IF return I2C_WaitforACK: - btfss SSPCON2,ACKSTAT ; checks for ACK bit from slave - return + btfss SSP1CON2,ACKSTAT ; checks for ACK bit from slave + return I2CFail: rcall I2CReset ; I2C Reset - bcf PIR1,SSPIF + bcf PIR1,SSP1IF clrf i2c_temp + bsf i2c_error_flag ; set error flag return I2CReset: ; Something went wrong (Slave holds SDA low?) @@ -76,7 +89,7 @@ clrf SSP1CON1 ; setup I²C Mode WAITMS d'10' ; Reset-Timeout for I2C devices movlw b'00000000' ; with slew rate control - movwf SSPSTAT + movwf SSP1STAT movlw b'00101000' movwf SSP1CON1 movlw b'00000000' @@ -121,9 +134,11 @@ global I2C_RX_accelerometer I2C_RX_accelerometer: + btfsc compass_type2 ; compass2 + bra I2C_RX_accelerometer_compass2 ; yes btfsc compass_type ; compass1? bra I2C_RX_accelerometer_compass1 ; yes -;I2C_RX_accelerometer_compass0: +I2C_RX_accelerometer_compass0: bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP movlw 0x38 ; address @@ -190,8 +205,7 @@ movff hi,accel_DZ+1 ; Copy result bsf SSP1CON2,PEN ; Stop condition - rcall WaitMSSP - return + bra WaitMSSP ; (And return) I2C_RX_accelerometer_compass1: bsf SSP1CON2,SEN ; Start condition @@ -203,19 +217,21 @@ bsf SSP1CON2,RSEN ; Repeated start condition (!) rcall WaitMSSP movlw 0x3D ; address +I2C_RX_accelerometer_compass1_xx: ; compass2 continues here... rcall I2C_TX - ; Non-flipped screen: ; Chip orientation on the PCB requires ; Original = Corrected - ; x = -x + ; x = -x (Compass 1) + ; x = x (Compass 2) ; y = -y ; z = -z ; Flipped screen: ; Chip orientation on the PCB requires ; Original = Corrected - ; x = x + ; x = x (Compass 1) + ; x = -x (Compass 2) ; y = y ; z = -z @@ -225,16 +241,30 @@ rcall I2C_OneByteRX movff SSP1BUF,hi ;accel_DX+1 rcall I2C_TwoBytesRX_div16_2; devide lo:hi/16 (signed) only + btfss compass_type2 ; compass 2? + bra I2C_RX_accelerometer1_c1 ; No, compass 1 + ; compass 2 + btfss flip_screen ; 180° rotation ? + bra I2C_RX_accelerometer2_c1 ; No, continue with normal compass1 routines for Y and Z + ; flipped compass 2, negate x + comf hi ; 16bit sign change. + negf lo + btfsc STATUS,C ; Carry to propagate ? + incf hi,F ; YES: do it. + bra I2C_RX_accelerometer2_c1 ; continue with normal compass1 routines for Y and Z + +I2C_RX_accelerometer1_c1: btfsc flip_screen ; 180° rotation ? bra I2C_RX_accelerometer2_c1 ; Yes + ; non-flipped compass 1, negate x comf hi ; 16bit sign change. negf lo btfsc STATUS,C ; Carry to propagate ? incf hi,F ; YES: do it. I2C_RX_accelerometer2_c1: + ; flipped compass 1, non-flipped compass 2 movff lo,accel_DX+0 movff hi,accel_DX+1 ; Copy result - rcall I2C_OneByteRX movff SSP1BUF,lo ;accel_DY+0 rcall I2C_OneByteRX @@ -268,6 +298,18 @@ movff hi,accel_DZ+1 ; Copy result return +I2C_RX_accelerometer_compass2: + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x32 ; address + rcall I2C_TX + movlw b'10101000' ; 0x28 with auto-increment (MSB=1) + rcall I2C_TX + bsf SSP1CON2,RSEN ; Repeated start condition (!) + rcall WaitMSSP + movlw 0x33 ; address + bra I2C_RX_accelerometer_compass1_xx + I2C_OneByteRX: bsf SSP1CON2, RCEN ; Enable recieve mode rcall WaitMSSP @@ -276,9 +318,11 @@ global I2C_RX_compass I2C_RX_compass: + btfsc compass_type2 ; compass2 + bra I2C_RX_compass2 ; yes btfsc compass_type ; compass1? bra I2C_RX_compass1 ; yes -;I2C_RX_compass0: +I2C_RX_compass0: bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP movlw 0x3C ; address @@ -288,7 +332,7 @@ bsf SSP1CON2,PEN ; Stop condition rcall WaitMSSP - bcf PIR1,SSPIF + bcf PIR1,SSP1IF bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP movlw 0x3D ; address @@ -317,17 +361,17 @@ ; y = -x rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,compass_DY+1; Data Byte + movff SSP1BUF,compass_DY+1; Data Byte rcall I2C_OneByteRX ; Get one byte - movff SSP1BUF,compass_DY+0; Data Byte + movff SSP1BUF,compass_DY+0; Data Byte btfsc flip_screen ; 180° rotation ? - bra I2C_RX_compass2 ; Yes + bra I2C_RX_compass0_2 ; Yes banksel compass_DY comf compass_DY+1 ; 16bit sign change. negf compass_DY+0 btfsc STATUS,C ; Carry to propagate ? incf compass_DY+1,F ; YES: do it. -I2C_RX_compass2: +I2C_RX_compass0_2: banksel common rcall I2C_OneByteRX ; Get one byte movff SSP1BUF,compass_DZ+1; Data Byte @@ -362,7 +406,7 @@ rcall WaitMSSP movlw 0x3D ; address rcall I2C_TX - +;rcall WaitMSSP ; Needed? (mH) rcall I2C_OneByteRX ; Get one byte movff SSP1BUF,lo ; Data Byte rcall I2C_OneByteRX ; Get one byte @@ -406,12 +450,79 @@ movff lo,compass_DZ+0 movff hi,compass_DZ+1 bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ;(And return) + +I2C_RX_compass2: ; newest compass + bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP - return - + movlw 0x3C ; address + rcall I2C_TX + movlw 0xE8 ; 0x68 with auto-increment (MSB=1) + rcall I2C_TX + bsf SSP1CON2,RSEN ; Repeated start condition (!) + rcall WaitMSSP + movlw 0x3D ; address + rcall I2C_TX +; rcall WaitMSSP + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,lo ; Data Byte + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,hi ; Data Byte +; rcall I2C_TwoBytesRX_div8_2 + btfsc flip_screen ; 180° rotation ? + bra I2C_RX_compass2_1 ; Yes, do nothing with X + ; No, flip X + comf hi ; 16bit sign change. + negf lo + btfsc STATUS,C ; Carry to propagate ? + incf hi,F ; YES: do it. +I2C_RX_compass2_1: + movff lo,compass_DX+0 + movff hi,compass_DX+1 + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,lo ; Data Byte + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,hi ; Data Byte +; rcall I2C_TwoBytesRX_div8_2 + btfss flip_screen ; 180° rotation ? + bra I2C_RX_compass2_2 ; No, do nothing with Y + ; Yes, flip Y + comf hi ; 16bit sign change. + negf lo + btfsc STATUS,C ; Carry to propagate ? + incf hi,F ; YES: do it. +I2C_RX_compass2_2: + movff lo,compass_DY+0 + movff hi,compass_DY+1 + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,lo ; Data Byte + rcall I2C_OneByteRX ; Get one byte + movff SSP1BUF,hi ; Data Byte + ;rcall I2C_TwoBytesRX_div8_2 + movff lo,compass_DZ+0 + movff hi,compass_DZ+1 + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ;(And return) + + global I2C_init_compass I2C_init_compass: bsf compass_enabled + bcf compass_type2 + ; probe compass 2 + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x32 ; Address byte + Write bit + movwf SSP1BUF ; control byte + rcall WaitMSSP + btfss SSP1CON2,ACKSTAT ; ACK? + bsf compass_type2 ; ACK send. compass2 present + bsf SSP1CON2,PEN ; Stop condition + rcall WaitMSSP + + btfsc compass_type2 + bra I2C_init_compass2 ; Compass2 + ; Check for compass0 or compass1... bsf compass_type ; set flag bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP @@ -421,7 +532,7 @@ rcall I2C_TX bsf SSP1CON2,PEN ; Stop condition rcall WaitMSSP - bcf PIR1,SSPIF + bcf PIR1,SSP1IF bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP movlw 0x3D ; address @@ -445,22 +556,6 @@ ; movlw b'01101001' ; ConfigA: 3Hz, 8 Samples averaged, Test Mode (Positive Bias) movlw b'01101000' ; ConfigA: 3Hz, 8 Samples averaged rcall I2C_TX - bra I2C_init_compass_common - - global I2C_init_compass_fast -I2C_init_compass_fast: - btfsc compass_type ; compass1? - bra I2C_init_compass_fast1 ; yes -;I2C_init_compass_fast0: - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x3C ; address - rcall I2C_TX - movlw 0x00 - rcall I2C_TX - movlw b'00111000' ; ConfigA: 75Hz, 2 Samples averaged -; movlw b'00111001' ; ConfigA: 75Hz, 2 Samples averaged, Test Mode (Positive Bias) - rcall I2C_TX I2C_init_compass_common: movff opt_compass_gain,i2c_temp ; 0-7 (230LSB/Gauss to 1370LSB/Gauss) swapf i2c_temp,F @@ -473,8 +568,7 @@ movlw b'00000000' ; Continous Mode rcall I2C_TX bsf SSP1CON2,PEN ; Stop condition - rcall WaitMSSP - return + bra WaitMSSP ; (And return) I2C_init_compass1: bsf SSP1CON2,SEN ; Start condition @@ -503,37 +597,32 @@ movlw b'00000000' ; CTRL7 Continuous Mode rcall I2C_TX bsf SSP1CON2,PEN ; Stop condition - rcall WaitMSSP - return + bra WaitMSSP ; (And return) -I2C_init_compass_fast1: - bsf SSP1CON2,SEN ; Start condition +I2C_init_compass2: + bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP movlw 0x3C ; address rcall I2C_TX - movlw 0x9F ; 1F with auto-increment (MSB=1) - rcall I2C_TX - movlw b'00000000' ; CTRL0 + movlw 0xE0 ; 0x60 with auto-increment (MSB=1) rcall I2C_TX - movlw b'01101111' ; CTRL1 (100Hz, BDU=0, x,y,z = ON) - rcall I2C_TX - movlw b'11000000' ; CTRL2 (50Hz, +/-2g, + movlw b'00000000' ; CFG_REG_A_M (10Hz, Continuous) rcall I2C_TX - movlw b'00000000' ; CTRL3 - rcall I2C_TX - movlw b'00000000' ; CTRL4 + movlw b'00000000' ; CFG_REG_B_M (Low-Pass Filter off) rcall I2C_TX - movlw b'01110100' ; CTRL5 HIGH res, 100Hz + movlw b'00000000' ; CFG_REG_C_M BDU=0 rcall I2C_TX - bra init_compass1_common + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ;(And return) global I2C_sleep_compass I2C_sleep_compass: bcf compass_enabled - - btfsc compass_type ; compass1? - bra I2C_sleep_compass1 ; yes -;I2C_sleep_compass0: + btfsc compass_type2 ; compass2? + bra I2C_sleep_compass2 ; yes + btfsc compass_type ; compass1? + bra I2C_sleep_compass1 ; yes +I2C_sleep_compass0: bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP movlw 0x3C ; address @@ -547,8 +636,7 @@ movlw b'00000010' ; Idle Mode rcall I2C_TX bsf SSP1CON2,PEN ; Stop condition - rcall WaitMSSP - return + bra WaitMSSP ; (And return) I2C_sleep_compass1: bsf SSP1CON2,SEN ; Start condition @@ -570,59 +658,111 @@ movlw b'00000010' ; data for CTRL_REG7: magnetic sensor Power-down mode rcall I2C_TX bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ;(And return) + + +I2C_sleep_compass2: + ; magnetic + bsf SSP1CON2,SEN ; Start condition rcall WaitMSSP - return + movlw 0x3C ; address + rcall I2C_TX + movlw 0xE0 ; 0x60 with auto-increment (MSB=1) + rcall I2C_TX + movlw b'00000010' ; CFG_REG_A_M (Idle mode) + rcall I2C_TX + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ; (And return) +I2C_sleep_accelerometer2: + ; accelerometer + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x32 ; address + rcall I2C_TX + movlw 0x9F ; 1F with auto-increment (MSB=1) + rcall I2C_TX + movlw b'00000000' ; TEMP_CFG_REG_A (Temp sensor off) + rcall I2C_TX + movlw b'00000000' ; CTRL_REG1_A (All off) + rcall I2C_TX + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ; (And return) global I2C_init_accelerometer I2C_init_accelerometer: + btfsc compass_type2 ; compass2? + bra I2C_init_accelerometer2 ; Yes. + btfsc compass_type ; compass1? return ; yes, ignore rcall I2C_sleep_accelerometer ; Regs can only be changed in St.By mode - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x38 ; address + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x38 ; address rcall I2C_TX - movlw 0x0E ; XYZ_DATA_CFG + movlw 0x0E ; XYZ_DATA_CFG rcall I2C_TX - movlw b'00000000' ; High pass Filter=0 , +/- 2g range + movlw b'00000000' ; High pass Filter=0 , +/- 2g range rcall I2C_TX - bsf SSP1CON2,PEN ; Stop condition - rcall WaitMSSP + bsf SSP1CON2,PEN ; Stop condition + rcall WaitMSSP - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x38 ; address + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x38 ; address rcall I2C_TX - movlw 0x2A ; CTRL_REG1 + movlw 0x2A ; CTRL_REG1 rcall I2C_TX ; movlw b'00110000' ; CTRL_REG1: 160ms data rate, St.By Mode - movlw b'00110100' ; CTRL_REG1: 160ms data rate, St.By Mode, reduced noise mode + movlw b'00110100' ; CTRL_REG1: 160ms data rate, St.By Mode, reduced noise mode rcall I2C_TX - movlw b'00000010' ; CTRL_REG2: High Res in Active mode + movlw b'00000010' ; CTRL_REG2: High Res in Active mode rcall I2C_TX - bsf SSP1CON2,PEN ; Stop condition - rcall WaitMSSP + bsf SSP1CON2,PEN ; Stop condition + rcall WaitMSSP - bsf SSP1CON2,SEN ; Start condition - rcall WaitMSSP - movlw 0x38 ; address + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x38 ; address rcall I2C_TX - movlw 0x2A ; CTRL_REG1 + movlw 0x2A ; CTRL_REG1 rcall I2C_TX ; movlw b'00110001' ; CTRL_REG1: 160ms data rate, Active Mode - movlw b'00110101' ; CTRL_REG1: 160ms data rate, St.By Mode, reduced noise mode, Active Mode + movlw b'00110101' ; CTRL_REG1: 160ms data rate, St.By Mode, reduced noise mode, Active Mode + rcall I2C_TX + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ; (And return) + +I2C_init_accelerometer2: + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x32 ; address + rcall I2C_TX + movlw 0x9F ; 1F with auto-increment (MSB=1) rcall I2C_TX - bsf SSP1CON2,PEN ; Stop condition - rcall WaitMSSP - - return + movlw b'00000000' ; TEMP_CFG_REG_A (Temp sensor off) + rcall I2C_TX + movlw b'01010111' ; CTRL_REG1_A (100Hz, x,y,z = ON) + rcall I2C_TX + movlw b'00000000' ; CTRL_REG2_A + rcall I2C_TX + movlw b'00000000' ; CTRL_REG3_A + rcall I2C_TX + movlw b'00000000' ; CTRL_REG4_A (BDU=0, +/-2g, + rcall I2C_TX + movlw b'00000000' ; CTRL_REG5_A + rcall I2C_TX + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ; (And return) global I2C_sleep_accelerometer I2C_sleep_accelerometer: + btfsc compass_type2 ; Compass2 + bra I2C_sleep_accelerometer2 ; Yes btfsc compass_type ; compass1? return ; yes, ignore @@ -635,9 +775,8 @@ movlw b'00000000' ; St. By Mode rcall I2C_TX bsf SSP1CON2,PEN ; Stop condition - rcall WaitMSSP - return - + bra WaitMSSP ; (And return) + lt2942_init_again: clrf i2c_temp movlw 0x02 ; Point to accumulated charge registers @@ -649,11 +788,12 @@ rcall WaitMSSP rcall I2C_WaitforACK bsf SSP1CON2,PEN ; Stop condition - rcall WaitMSSP; (and return) + rcall WaitMSSP movff battery_acumulated_charge+1,sub_a+1 movff battery_acumulated_charge+0,sub_a+0 ; and init again... - global lt2942_init + + global lt2942_init lt2942_init: ; Setup Control register B clrf i2c_temp movlw 0x01 ; Point to control reg B @@ -662,7 +802,7 @@ movff WREG, SSP1BUF ; Data Byte rcall WaitMSSP rcall I2C_WaitforACK - bsf SSP1CON2,PEN ; Stop condition + bsf SSP1CON2,PEN ; Stop condition bra WaitMSSP ; (And return) global lt2942_get_status @@ -721,8 +861,7 @@ tstfsz batt_voltage+1 ; <256mV? return ; No, done. - rcall lt2942_init - return + bra lt2942_init ;(and return) ; global lt2942_get_temperature ;lt2942_get_temperature: ; Read temperature registers @@ -874,5 +1013,209 @@ rcall I2C_WaitforACK bsf SSP1CON2, RCEN ; Enable recieve mode bra WaitMSSP; (and return) + + + global I2C_probe_OSTC_rx +I2C_probe_OSTC_rx: + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x50 ; Address byte + Write bit + movwf SSP1BUF ; control byte + rcall WaitMSSP + btfss SSP1CON2,ACKSTAT ; ACK? + bsf ostc_rx_present ; ACK send. OSTC_RX present! + bsf SSP1CON2,PEN ; Stop condition + rcall WaitMSSP + btfss ostc_rx_present ; Do we have the RX? + return ; No, Done. + WAITMS .1 + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x50 ; Address byte + Write bit + movwf SSP1BUF ; control byte + rcall WaitMSSP + rcall I2C_WaitforACK + movlw 0x1B + movwf SSP1BUF ; Data Byte (Get firmware) + rcall WaitMSSP + rcall I2C_WaitforACK + bsf SSP1CON2,PEN ; Stop condition + rcall WaitMSSP + WAITMS .1 + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x51 ; Address byte + Read bit + movwf SSP1BUF ; control byte + rcall WaitMSSP + bsf SSP1CON2, RCEN ; Enable recieve mode + rcall WaitMSSP + movff SSP1BUF,rx_firmware+0 + bsf SSP1CON2,ACKEN ; Master acknowlegde + rcall WaitMSSP + + ; last byte in read from RX circuity always with a NACK! + bsf SSP1CON2, RCEN ; Enable recieve mode + rcall WaitMSSP + movff SSP1BUF,rx_firmware+1 + bsf SSP1CON2,ACKDT + bsf SSP1CON2,ACKEN ; Master NOT acknowlegde + rcall WaitMSSP + bcf SSP1CON2,ACKDT ; Reset ACKDT flag + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ;(and return) + + + global I2C_get_tankdata +I2C_get_tankdata: +; +; movlw .1 +; movff WREG,rx_buffer+0 +; movlw .125 +; movff WREG,rx_buffer+1 +; movlw HIGH .1500 +; movff WREG,rx_buffer+2 +; movlw LOW .1500 ; 150,0bar +; movff WREG,rx_buffer+3 +; +; movlw .1 +; movff WREG,rx_buffer+6 +; movlw .140 +; movff WREG,rx_buffer+7 +; movlw HIGH .2251 +; movff WREG,rx_buffer+8 +; movlw LOW .2251 ; 225,1bar +; movff WREG,rx_buffer+9 +; +; +; +; return ;mH + + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x50 ; Address byte + Write bit + movwf SSP1BUF ; control byte + rcall WaitMSSP + rcall I2C_WaitforACK + movlw 0x1E ; Read buffer2 (48 Bytes) + movwf SSP1BUF ; Data Byte + rcall WaitMSSP + rcall I2C_WaitforACK + bsf SSP1CON2,PEN ; Stop condition + rcall WaitMSSP + WAITMS .1 + + ; read 48 bytes + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x51 ; Address byte + read bit + movwf SSP1BUF ; control byte + rcall WaitMSSP + rcall I2C_WaitforACK + movlw .47 ; 47 with ACK + 1 w/o ACK + movwf temp1 + lfsr FSR2,rx_buffer+0 +I2C_get_tankdata_loop_read: + bsf SSP1CON2, RCEN ; Enable recieve mode + rcall WaitMSSP + movff SSP1BUF,POSTINC2 + bcf SSP1CON2,ACKDT + bsf SSP1CON2,ACKEN ; Master acknowlegde + rcall WaitMSSP + decfsz temp1,F + bra I2C_get_tankdata_loop_read + + ; 1 w/o ACK + bsf SSP1CON2, RCEN ; Enable recieve mode + rcall WaitMSSP + movff SSP1BUF,POSTINC2 + bsf SSP1CON2,ACKDT + bsf SSP1CON2,ACKEN ; Master NOT acknowlegde + rcall WaitMSSP + bcf SSP1CON2,ACKDT ; Reset ACKDT flag + + bsf SSP1CON2,PEN ; Stop condition + bra WaitMSSP ;(and return) + + + global I2C_update_OSTC_rx +I2C_update_OSTC_rx: ; 992*64byte master loop + bcf i2c_error_flag ; clear error flag + ; write 64 bytes + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x50 ; Address byte + Write bit + movwf SSP1BUF ; control byte + rcall WaitMSSP + rcall I2C_WaitforACK + lfsr FSR2,buffer ; send buffer for verify + movlw .64 + movwf temp1 +I2C_update_OSTC_loop: ; 64byte flash page loop + movff up,POSTINC2 ; store for verify + movff up,SSP1BUF + rcall WaitMSSP + rcall I2C_WaitforACK + call ext_flash_read_block ; Read one byte + movwf up ; prepare for transmit + decfsz temp1,F + bra I2C_update_OSTC_loop + bsf SSP1CON2,PEN ; Stop condition + rcall WaitMSSP + WAITMS .1 + + ; read 64 bytes + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x51 ; Address byte + read bit + movwf SSP1BUF ; control byte + rcall WaitMSSP + rcall I2C_WaitforACK + lfsr FSR2,buffer ; send buffer for verify + movlw .63 ; 63 with ACK + 1 w/o ACK + movwf temp1 +I2C_update_OSTC_loop_read: + bsf SSP1CON2, RCEN ; Enable recieve mode + rcall WaitMSSP + movf SSP1BUF,W + cpfseq POSTINC2 ; compare readback with original + bsf i2c_error_flag ; Not equal, set flag + bcf SSP1CON2,ACKDT + bsf SSP1CON2,ACKEN ; Master acknowlegde + rcall WaitMSSP + decfsz temp1,F + bra I2C_update_OSTC_loop_read + + ; 1 w/o ACK + bsf SSP1CON2, RCEN ; Enable recieve mode + rcall WaitMSSP + movf SSP1BUF,W + cpfseq POSTINC2 ; compare readback with original + bsf i2c_error_flag ; Not equal, set flag + bsf SSP1CON2,ACKDT + bsf SSP1CON2,ACKEN ; Master NOT acknowlegde + rcall WaitMSSP + bcf SSP1CON2,ACKDT ; Reset ACKDT flag + + bsf SSP1CON2,PEN ; Stop condition + rcall WaitMSSP + WAITMS .1 + + bsf SSP1CON2,SEN ; Start condition + rcall WaitMSSP + movlw 0x50 ; Address byte + Write bit + movwf SSP1BUF ; control byte + rcall WaitMSSP + rcall I2C_WaitforACK + movlw 0x1F ; Write command! + movwf SSP1BUF ; Data Byte + rcall WaitMSSP + rcall I2C_WaitforACK + bsf SSP1CON2,PEN ; Stop condition + rcall WaitMSSP + WAITMS .5 ; Required waiting time + + btfss i2c_error_flag + retlw .0 ; All ok + retlw .255 ; an error occured END \ No newline at end of file
--- a/src/i2c.inc Wed Dec 27 14:34:11 2017 +0100 +++ b/src/i2c.inc Wed Jan 31 19:39:37 2018 +0100 @@ -8,11 +8,10 @@ ; HISTORY ; 2012-10-24 : [mH] Creation - extern I2C_RX_accelerometer - extern I2C_init_accelerometer + extern I2C_RX_accelerometer + extern I2C_init_accelerometer extern I2C_sleep_accelerometer extern I2C_init_compass - extern I2C_init_compass_fast extern I2C_sleep_compass extern I2C_RX_compass extern lt2942_get_voltage ; Read battery voltage registers
--- a/src/isr.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/isr.asm Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File isr.asm +; File isr.asm REFACTORED VERSION V2.92 ; ; INTERUPT subroutines ; @@ -19,7 +19,7 @@ extern start -isr_high CODE 0x0008 ;High Priority Interrups +isr_high CODE 0x0008 ; High Priority Interrups bra HighInt nop nop @@ -29,7 +29,7 @@ nop bra HighInt -isr_low CODE 0x00018 ;Low Priority Interrups +isr_low CODE 0x00018 ; Low Priority Interrups ; *** low priority interrupts not used retfie FAST ; Restores BSR, STATUS and WREG @@ -45,7 +45,7 @@ btfsc INTCON3,INT1IF ; Buttons rcall isr_switch_left -; IR/S8-Link +; IR/S8-Linktimer1int btfsc PIR3,RC2IF ; UART2 rcall isr_uart2 ; IR/S8-Link btfsc PIR2,TMR3IF ; Timer 3 @@ -104,7 +104,7 @@ restore_flash_0x00080: goto restore_flash - +isr_routines; CODE ;============================================================================= isr_uart2: ; IR/S8-Link @@ -838,24 +838,56 @@ ;============================================================================= check_nofly_desat_time: - movf nofly_time+0,W ; Is nofly null ? - iorwf nofly_time+1,W - bz check_nofly_desat_time2 ; yes... + + ; DELETE - no-fly time is now re-computed every second ## no fly + ; ; REPLACE ## no fly + ; ; movf nofly_time+0,W ; Is nofly null ? + ; ; iorwf nofly_time+1,W + ; ; BY + ; banksel int_O_nofly_time + ; movf int_O_nofly_time+0,W ; Is nofly null ? + ; iorwf int_O_nofly_time+1,W + + ; bz check_nofly_desat_time2 ; yes... - movlw d'1' - subwf nofly_time+0,F - movlw d'0' - subwfb nofly_time+1,F ; reduce by one + ; movlw d'1' + ; ; REPLACE ## no fly + ; ; subwf nofly_time+0,F + ; ; BY + ; subwf int_O_nofly_time+0,F + + ; movlw d'0' + + ; ; REPLACE ## no fly + ; ; subwfb nofly_time+1,F ; reduce by one + ; ; BY + ; subwfb int_O_nofly_time+1,F ; reduce by one check_nofly_desat_time2: - movf desaturation_time+0,W ; Is Desat null ? - iorwf desaturation_time+1,W - bz check_nofly_desat_time3 ; yes... + ; REPLACE + ; movf desaturation_time+0,W ; Is Desat null ? + ; iorwf desaturation_time+1,W + ; BY + banksel int_O_desaturation_time + movf int_O_desaturation_time+0,W ; Is Desat null ? + iorwf int_O_desaturation_time+1,W + + bz check_nofly_desat_time3 ; yes... - movlw d'1' - subwf desaturation_time+0,F - movlw d'0' - subwfb desaturation_time+1,F ; reduce by one... + ; DELETE - desat-time is now re-computed every second ## no fly + ; movlw d'1' + ; ; REPLACE ## no fly + ; ; subwf desaturation_time+0,F + ; ; BY + ; subwf int_O_desaturation_time+0,F + + ; movlw d'0' + + ; ; REPLACE ## no fly + ; ; subwfb desaturation_time+1,F ; reduce by one... + ; ; by + ; subwfb int_O_desaturation_time+1,F ; reduce by one... + banksel common ; Increase surface interval timer infsnz surface_interval+0,F @@ -863,6 +895,9 @@ return ; Done check_nofly_desat_time3: + ; NEW ## no fly + banksel common + clrf surface_interval+0 clrf surface_interval+1 ; Clear surface interval timer return ; Done.
--- a/src/logbook.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/logbook.asm Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File logbook.asm +; File logbook.asm REFACTORED VERSION V2.91 ; ; Logbook ; @@ -94,7 +94,7 @@ #DEFINE log_max_value_column .1 ; Divetime #DEFINE log_divetime_value_row .38 - #DEFINE log_divetime_value_column .65 + #DEFINE log_divetime_value_column .60 ; UPDATED, old value was .65 ; Gaslist below profile #DEFINE log_gas_row .225 #DEFINE log_gas_column1 .0 @@ -234,7 +234,7 @@ clrf logbook_flags clrf CCP1CON ; stop PWM bcf PORTC,2 ; Pull PWM out to GND - call TFT_boot + call TFT_boot ; call TFT_standard_color clrf menupos3 ; Here: used rows on current logbook-page clrf logbook_page_number ; Here: # of current displayed page @@ -464,41 +464,48 @@ call TFT_convert_date ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2 STRCAT_PRINT "" +; NEW code block ## logbook look and feel + WIN_SMALL log_divetime_value_column,logbook_date_row ; align with surrounding data + LOG_POINT_TO log_divemode + call ext_flash_byte_read_plus ; 0=OC, 1=CC, 2=Gauge, 3=Apnea into temp1 + movff temp1,lo + call TFT_display_decotype_surface1 ; "strcat_print"s divemode (OC, CC, APNEA or GAUGE) + WIN_SMALL logbook_time_column, logbook_time_row call ext_flash_byte_read_plus ; hour movff temp1,lo call ext_flash_byte_read_plus ; Minutes movff temp1,hi - output_99x ; hour + output_99x ; hour PUTC ':' movff hi,lo - output_99x ; minute - STRCAT_PRINT "" ; Display 1st row of details + output_99x ; minute + STRCAT_PRINT "" ; Display 1st row of details LOG_POINT_TO log_profile_version - call ext_flash_byte_read_plus ; Profile version + call ext_flash_byte_read_plus ; Profile version movlw 0x24 - cpfslt temp1 ; <0x24? - bra log_skip_extra_icon ; Yes, skip + cpfslt temp1 ; <0x24? + bra log_skip_extra_icon ; Yes, skip WIN_SMALL logbook_time_column-.8, logbook_time_row - STRCPY_PRINT 0x94 ; "End of dive" icon + STRCPY_PRINT 0x94 ; "End of dive" icon log_skip_extra_icon: LOG_POINT_TO log_max_depth - call ext_flash_byte_read_plus ; read max depth + call ext_flash_byte_read_plus ; read max depth movff temp1,lo - call ext_flash_byte_read_plus ; read max depth + call ext_flash_byte_read_plus ; read max depth movff temp1,hi - movff lo,xA+0 ; calculate y-scale for profile display + movff lo,xA+0 ; calculate y-scale for profile display movff hi,xA+1 - movlw profile_height_pixels ; pixel height available for profile + movlw profile_height_pixels ; pixel height available for profile movwf xB+0 clrf xB+1 - call div16x16 ; does xA/xB=xC - movff xC+0,y_scale+0 ; holds LOW byte of y-scale (mbar/pixel!) - movff xC+1,y_scale+1 ; holds HIGH byte of y-scale (mbar/pixel!) - infsnz y_scale+0,F ; increase one, because there may be a remainder + call div16x16 ; does xA/xB=xC + movff xC+0,y_scale+0 ; holds LOW byte of y-scale (mbar/pixel!) + movff xC+1,y_scale+1 ; holds HIGH byte of y-scale (mbar/pixel!) + infsnz y_scale+0,F ; increase one, because there may be a remainder incf y_scale+1,F movlw LOW ((profile_height_pixels+1)*.1000) @@ -789,9 +796,9 @@ profile_display_loop: ; Init pixel write - movf logbook_pixel_x_pos,W - mullw 2 - call pixel_write_col320 + movf logbook_pixel_x_pos,W + mullw 2 + call pixel_write_col320 movff profile_temp+0,profile_temp2+0 movff profile_temp+1,profile_temp2+1 ; 16Bit x-scaler @@ -920,15 +927,15 @@ incf apnoe_mins,W ; increase row (Y) movwf win_top ; limit win_top to 220 - movlw .220 - cpfslt win_top - movwf win_top + movlw .220 + cpfslt win_top + movwf win_top decf logbook_pixel_x_pos,W ; decrease column (X) movwf win_leftx2 ; limit win_leftx2 to 151 - movlw .151 - cpfslt win_leftx2 - movwf win_leftx2 + movlw .151 + cpfslt win_leftx2 + movwf win_leftx2 movlw color_orange call TFT_set_color @@ -990,31 +997,31 @@ display_profile_no_profile: ; No profile available for this dive! profile_display_loop_done: - btfss is_bailout ; Bailout during the dive? - bra profile_display_loop_done_nobail ; No + btfss is_bailout ; Bailout during the dive? + bra profile_display_loop_done_nobail ; No ; Yes, show "Bailout" - movlw color_pink - call TFT_set_color + movlw color_pink + call TFT_set_color WIN_TINY logbook_bailout_column,logbook_bailout_row STRCPY_TEXT_PRINT tDiveBailout ; Bailout profile_display_loop_done_nobail: - btfss gas6_changed ; Gas6 - bra profile_display_loop_done_nogas6 ; No + btfss gas6_changed ; Gas6 + bra profile_display_loop_done_nogas6 ; No ; Yes, show "Gas 6!" - movlw color_pink - call TFT_set_color + movlw color_pink + call TFT_set_color WIN_TINY logbook_bailout_column,logbook_bailout_row-.15 - STRCPY_TEXT tGas ; Gas - STRCAT_PRINT " 6!" + STRCPY_TEXT tGas ; Gas + STRCAT_PRINT " 6!" profile_display_loop_done_nogas6: - decf divesecs,F ;-1 + decf divesecs,F ;-1 read_int_eeprom .2 - movf EEDATA,W - bcf STATUS,C - subfwb divesecs,W ; max. dives (low value) - divesecs - movwf lo ; result - incf divesecs,F ;+1 + movf EEDATA,W + bcf STATUS,C + subfwb divesecs,W ; max. dives (low value) - divesecs + movwf lo ; result + incf divesecs,F ;+1 ; Set ext_flash_address:3 to TOC entry of this dive ; 1st: 200000h-200FFFh -> lo=0 ; 2nd: 201000h-201FFFh -> lo=1 @@ -1091,7 +1098,6 @@ STRCAT_TEXT_PRINT tLogTunitC logbook_show_temp_common: - bcf leftbind call TFT_standard_color @@ -1126,9 +1132,15 @@ rcall logbook_preloop_tasks ; Clear some flags and set to Speed_eco display_profile_loop: - btfsc switch_left ; SET/MENU? + ; REPLACE ## logbook look and feel + ; btfsc switch_left ; SET/MENU? + ; BY + btfsc switch_right bra logbook_page2 ; Show more information - btfsc switch_right ; ENTER? + ; REPLACE ## logbook look and feel + ; btfsc switch_right ; ENTER? + ; BY + btfsc switch_left bra exit_profileview ; back to list rcall log_screendump_and_onesecond ; Check if we need to make a screenshot and check for new second @@ -1137,7 +1149,7 @@ bra display_profile_loop ; wait for something to do global log_screendump_and_onesecond -log_screendump_and_onesecond: ; Check if we need to make a screenshot and check for new second +log_screendump_and_onesecond: ; Check if we need to make a screenshot and check for new second btfsc onesecupdate call timeout_surfmode ; Timeout btfsc onesecupdate @@ -1219,23 +1231,23 @@ bra profile_display_fill_up ; Yes! profile_display_fill_down2: ; Loop - decf xC+1,F + decf xC+1,F HALF_PIXEL_WRITE xC+1 ; Updates just row (0..239) - movf xC+0,W - cpfseq xC+1 ; Loop until xC+1=xC+0 - bra profile_display_fill_down2 + movf xC+0,W + cpfseq xC+1 ; Loop until xC+1=xC+0 + bra profile_display_fill_down2 return ; apnoe_mins and xC+0 are untouched profile_display_fill_up: ; Fill upwards from xC+0 to apone_mins! - incf xC+1,F + incf xC+1,F HALF_PIXEL_WRITE xC+1 ; Updates just row (0..239) - movf xC+0,W - cpfseq xC+1 ; Loop until xC+1=apnoe_mins - bra profile_display_fill_up + movf xC+0,W + cpfseq xC+1 ; Loop until xC+1=apnoe_mins + bra profile_display_fill_up return ; apnoe_mins and xC+0 are untouched ;============================================================================= @@ -1247,26 +1259,26 @@ movf logbook_sample_counter+0,W cpfseq average_depth_hold_total+0 - bra profile_view_get_depth_no_line ; no need to draw a 10min line, continue + bra profile_view_get_depth_no_line ; no need to draw a 10min line, continue movf logbook_sample_counter+1,W cpfseq average_depth_hold_total+1 - bra profile_view_get_depth_no_line ; no need to draw a 10min line, continue -; draw a new 10min line here... + bra profile_view_get_depth_no_line ; no need to draw a 10min line, continue + ; draw a new 10min line here... clrf logbook_sample_counter+0 - clrf logbook_sample_counter+1 ; clear counting registers for next line + clrf logbook_sample_counter+1 ; clear counting registers for next line ; Vertical lines... movlw color_deepblue - call TFT_set_color ; Make this configurable? + call TFT_set_color ; Make this configurable? movlw profile_top+.1 movwf win_top - incf logbook_pixel_x_pos,W ; draw one line to right to make sure it's the background of the profile - movwf win_leftx2 ; Left border (0-159) + incf logbook_pixel_x_pos,W ; draw one line to right to make sure it's the background of the profile + movwf win_leftx2 ; Left border (0-159) movlw profile_height_pixels movwf win_height movlw profile_height_pixels - movwf win_width ; "Window" height - call half_horizontal_line ; Inputs: win_top, win_leftx2, win_width, win_color1, win_color2 + movwf win_width ; "Window" height + call half_horizontal_line ; Inputs: win_top, win_leftx2, win_width, win_color1, win_color2 profile_view_get_depth_no_line: call ext_flash_byte_read_plus_0x20 ; read depth first @@ -1276,43 +1288,43 @@ call ext_flash_byte_read_plus_0x20 ; read Profile Flag Byte movff temp1,timeout_counter2 ; store Profile Flag Byte - bcf event_occured ; clear flag + bcf event_occured ; clear flag btfsc timeout_counter2,7 - bsf event_occured ; We also have an Event byte! - bcf timeout_counter2,7 ; Clear Event Byte Flag (If any) + bsf event_occured ; We also have an Event byte! + bcf timeout_counter2,7 ; Clear Event Byte Flag (If any) ; timeout_counter2 now holds the number of additional bytes to ignore (0-127) - movlw 0xFD ; end of profile bytes? + movlw 0xFD ; end of profile bytes? cpfseq logbook_cur_depth+0 - bra profile_view_get_depth_new1 ; no 1st. 0xFD + bra profile_view_get_depth_new1 ; no 1st. 0xFD cpfseq logbook_cur_depth+1 - bra profile_view_get_depth_new1 ; no 2nd. 0xFD - bsf end_of_profile ; End found! Set Flag! Skip remaining pixels! + bra profile_view_get_depth_new1 ; no 2nd. 0xFD + bsf end_of_profile ; End found! Set Flag! Skip remaining pixels! return profile_view_get_depth_new1: - btfsc event_occured ; Was there an event attached to this sample? + btfsc event_occured ; Was there an event attached to this sample? rcall profile_view_get_depth_events ; Yes, get information about this event(s) ;---- Read Tp°, if any AND divisor reached AND bytes available ----------- - movf divisor_temperature,W ; Is Tp° divisor null ? - bz profile_view_get_depth_no_tp; Yes: no Tp° curve. - decf count_temperature,F ; Decrement tp° counter - bnz profile_view_get_depth_no_tp; No temperature this time + movf divisor_temperature,W ; Is Tp° divisor null ? + bz profile_view_get_depth_no_tp ; Yes: no Tp° curve. + decf count_temperature,F ; Decrement tp° counter + bnz profile_view_get_depth_no_tp ; No temperature this time - call ext_flash_byte_read_plus_0x20 ; Tp° low + call ext_flash_byte_read_plus_0x20 ; Tp° low decf timeout_counter2,F movff temp1,logbook_cur_tp+0 - call ext_flash_byte_read_plus_0x20 ; Tp° high + call ext_flash_byte_read_plus_0x20 ; Tp° high decf timeout_counter2,F movff temp1,logbook_cur_tp+1 movff divisor_temperature,count_temperature ; Restart counter. ; Compute Tp° max on the fly... - movff logbook_cur_tp+0,sub_a+0 ; Compare cur_tp > max_tp ? + movff logbook_cur_tp+0,sub_a+0 ; Compare cur_tp > max_tp ? movff logbook_cur_tp+1,sub_a+1 movff logbook_max_tp+0,sub_b+0 movff logbook_max_tp+1,sub_b+1 - call sub16 ; SIGNED sub_a - sub_b + call sub16 ; SIGNED sub_a - sub_b btfsc neg_flag bra profile_view_get_depth_no_tp @@ -1337,30 +1349,30 @@ call ext_flash_byte_read_plus_0x20 decf timeout_counter2,F movff temp1,logbook_ceiling - movff divisor_deco,count_deco ; Restart counter. + movff divisor_deco,count_deco ; Restart counter. call ext_flash_byte_read_plus_0x20 ; Skip stop length decf timeout_counter2,F ;---- Read GF, if any AND divisor=0 AND bytes available ------------------ profile_view_get_depth_no_deco: ; Then skip remaining bytes... - movf timeout_counter2,W ; number of additional bytes to ignore (0-127) - tstfsz timeout_counter2 ; Anything to skip? - call incf_ext_flash_address0_0x20; Yes, increases bytes in ext_flash_address:3 with 0x200000 bank switching + movf timeout_counter2,W ; number of additional bytes to ignore (0-127) + tstfsz timeout_counter2 ; Anything to skip? + call incf_ext_flash_address0_0x20 ; Yes, increases bytes in ext_flash_address:3 with 0x200000 bank switching return profile_view_get_depth_events: - clrf EventByte2 ; Clear EventByte2 - call ext_flash_byte_read_plus_0x20 ; Read Event byte - movff temp1,EventByte ; store EventByte - decf timeout_counter2,F ; reduce counter + clrf EventByte2 ; Clear EventByte2 + call ext_flash_byte_read_plus_0x20 ; Read Event byte + movff temp1,EventByte ; store EventByte + decf timeout_counter2,F ; reduce counter - btfss EventByte,7 ; Another Event byte? - bra profile_no_second_eventbyte ; No - call ext_flash_byte_read_plus_0x20; Read Event byte2 - movff temp1,EventByte2 ; store EventByte2 - decf timeout_counter2,F ; reduce counter - bcf EventByte,7 ; Clear flag + btfss EventByte,7 ; Another Event byte? + bra profile_no_second_eventbyte ; No + call ext_flash_byte_read_plus_0x20 ; Read Event byte2 + movff temp1,EventByte2 ; store EventByte2 + decf timeout_counter2,F ; reduce counter + bcf EventByte,7 ; Clear flag profile_no_second_eventbyte: ; Check event flags in the EventBytes @@ -1383,10 +1395,10 @@ return logbook_event4: ; Stored Gas changed! - call ext_flash_byte_read_plus_0x20 ; Read Gas# - decf timeout_counter2,F ; reduce counter + call ext_flash_byte_read_plus_0x20 ; Read Gas# + decf timeout_counter2,F ; reduce counter movff temp1,average_depth_hold_total+3 - rcall profile_display_color ; Change profile color according to gas number + rcall profile_display_color ; Change profile color according to gas number return logbook_event1: ; Gas6 changed @@ -1423,7 +1435,7 @@ exit_profileview: ; call speed_fastest bcf sleepmode - clrf timeout_counter2 ; restore all registers to build same page again + clrf timeout_counter2 ; restore all registers to build same page again movff divemins_backup,divemins+0 movff logbook_divenumber_temp, logbook_divenumber movff logbook_max_dive_counter_temp,logbook_max_dive_counter @@ -1437,7 +1449,7 @@ call TFT_boot clrf CCP1CON ; stop PWM bcf PORTC,2 ; Pull PWM out to GND - call TFT_boot + call TFT_boot ; call TFT_ClearScreen ; clear details/profile goto logbook2 ; start search @@ -1456,24 +1468,24 @@ goto logbook2 ; start search next_logbook3: - incf menupos,F ; +1 + incf menupos,F ; +1 movlw logbook_row_number+.2 - cpfsgt menupos ; =logbook_row_number+.3? - bra next_logbook3a ; No + cpfsgt menupos ; =logbook_row_number+.3? + bra next_logbook3a ; No movlw .1 movwf menupos bra next_logbook3b next_logbook3a: - incf menupos3,W ; last entry in current page +1 - cpfseq menupos ; same as cursor pos.? - bra next_logbook3b ; No - movlw logbook_row_number+.1 ; Yes, ... - movwf menupos ; ... jump directly to "next page" if page is not full + incf menupos3,W ; last entry in current page +1 + cpfseq menupos ; same as cursor pos.? + bra next_logbook3b ; No + movlw logbook_row_number+.1 ; Yes, ... + movwf menupos ; ... jump directly to "next page" if page is not full movlw logbook_row_number - cpfseq menupos3 ; Last dive was row logbook_row_number? - bsf all_dives_shown ; No, set flag to load first page again (full reset) + cpfseq menupos3 ; Last dive was row logbook_row_number? + bsf all_dives_shown ; No, set flag to load first page again (full reset) next_logbook3b: clrf timeout_counter2 @@ -1504,11 +1516,11 @@ display_listdive1: ; Check limit (lo:hi must be <1000) - movlw LOW d'1000' ; Compare to 1000 - subwf lo,W - movlw HIGH d'1000' - subwfb hi,W - bc display_listdive1b ; carry = no-borrow = > 1000, skip! + movlw LOW d'1000' ; Compare to 1000 + subwf lo,W + movlw HIGH d'1000' + subwfb hi,W + bc display_listdive1b ; carry = no-borrow = > 1000, skip! infsnz lo,F incf hi,F ; hi:lo = hi:lo + 1 @@ -1525,7 +1537,7 @@ clrf hi movff logbook_divenumber,lo ; lo=0 and hi=0 -> show without applied offset display_listdive1a: - output_16_3 ; displays only last three figures from a 16Bit value (0-999), # of dive + output_16_3 ; displays only last three figures from a 16Bit value (0-999), # of dive PUTC ' ' LOG_POINT_TO log_date+1 ; Point to month call ext_flash_byte_read_plus @@ -1544,22 +1556,22 @@ call ext_flash_byte_read_plus movff temp1,hi - TSTOSS opt_units ; 0=Meters, 1=Feets + TSTOSS opt_units ; 0=Meters, 1=Feets bra display_listdive2_metric ;display_listdive2_imperial: - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet PUTC ' ' bcf leftbind - output_16_3 ; limit to 999 and display only (0-999) + output_16_3 ; limit to 999 and display only (0-999) STRCAT_TEXT tFeets1 bra display_listdive3 display_listdive2_metric: - bsf ignore_digit5 ; no cm... - movlw d'1' ; +1 - movff WREG,ignore_digits ; no 1000m + bsf ignore_digit5 ; no cm... + movlw d'1' ; +1 + movff WREG,ignore_digits ; no 1000m bcf leftbind - output_16dp .3 ; xxx.y + output_16dp .3 ; xxx.y STRCAT_TEXT tMeters PUTC ' ' @@ -1570,8 +1582,8 @@ movff temp1,hi output_16_3 ; Divetime minutes (0-999min) STRCAT_TEXT tMinutes - clrf WREG - movff WREG,buffer+.21 ; limit to 21 chars + clrf WREG + movff WREG,buffer+.21 ; limit to 21 chars STRCAT_PRINT "" ; Display header-row in list return @@ -1591,263 +1603,281 @@ movff hi,sub_a+1 movff divesecs,sub_b+0 clrf sub_b+1 - call subU16 ; sub_c = sub_a - sub_b + call subU16 ; sub_c = sub_a - sub_b movff sub_c+0,lo movff sub_c+1,hi logbook_show_divenumber3: WIN_MEDIUM logbook_divenumer_column, logbook_divenumer_row bsf leftbind - output_16 ; # of dive in logbook + output_16 ; # of dive in logbook bcf leftbind - STRCAT_PRINT "" + STRCAT_PRINT "" return logbook_page2: ; Show more info - rcall log_details_header ; Shows number, time/date and basic dive info + rcall log_details_header ; Shows number, time/date and basic dive info ; Deco model WIN_SMALL .5,.65 - LOG_POINT_TO log_decomodel - call ext_flash_byte_read_plus ; read deco model + LOG_POINT_TO log_decomodel + call ext_flash_byte_read_plus ; read deco model movff temp1,lo decfsz temp1,F bra logbook_decomodel1 ; Deco model GF Version - STRCAT_TEXT_PRINT tZHL16GF - LOG_POINT_TO log_gf_lo + STRCAT_PRINT "ZH-L16+GF" + LOG_POINT_TO log_gf_lo WIN_SMALL .5,.90 STRCPY_TEXT tGF - call ext_flash_byte_read_plus ; Read GF lo + call ext_flash_byte_read_plus ; Read GF lo movff temp1,lo output_8 - STRCAT "%/" + STRCAT "%/" bra logbook_decomodel_common logbook_decomodel1: ; Deco model NON-GF Version - STRCAT_TEXT_PRINT tZHL16 - LOG_POINT_TO log_sat_mult + STRCAT_PRINT "ZH-L16" + LOG_POINT_TO log_sat_mult WIN_SMALL .5,.90 - call ext_flash_byte_read_plus ; Read sat_mult + call ext_flash_byte_read_plus ; Read sat_mult movff temp1,lo output_8 - STRCAT "%/" + STRCAT "%/" logbook_decomodel_common: - call ext_flash_byte_read_plus ; Read desat_mult or GF_hi + call ext_flash_byte_read_plus ; Read desat_mult or GF_hi movff temp1,lo output_8 - STRCAT_PRINT "%" + STRCAT_PRINT "%" ; CNS - LOG_POINT_TO log_cns_start + LOG_POINT_TO log_cns_start WIN_SMALL .5,.115 STRCPY_TEXT tCNS2 - call ext_flash_byte_read_plus ; read cns low + call ext_flash_byte_read_plus ; read cns low movff temp1,lo - call ext_flash_byte_read_plus ; read cns high + call ext_flash_byte_read_plus ; read cns high movff temp1,hi output_16 - LOG_POINT_TO log_cns_end + LOG_POINT_TO log_cns_end STRCAT "->" - call ext_flash_byte_read_plus ; read CNS low + call ext_flash_byte_read_plus ; read CNS low movff temp1,lo - call ext_flash_byte_read_plus ; read CNS high + call ext_flash_byte_read_plus ; read CNS high movff temp1,hi output_16 - STRCAT_PRINT "%" + STRCAT_PRINT "%" ; Salinity WIN_SMALL .5,.140 - LOG_POINT_TO log_salinity + LOG_POINT_TO log_salinity STRCPY_TEXT tDvSalinity bsf leftbind - call ext_flash_byte_read_plus ; read salinity + call ext_flash_byte_read_plus ; read salinity movff temp1,lo - movff temp1,total_divetime_seconds+1 ; backup for average depth display + movff temp1,total_divetime_seconds+1 ; backup for average depth display output_8 - STRCAT_PRINT "%" + STRCAT_PRINT "%" ; Average depth WIN_SMALL .5,.165 STRCPY_TEXT tAVG - LOG_POINT_TO log_avr_depth - call ext_flash_byte_read_plus ; read avr low + LOG_POINT_TO log_avr_depth + call ext_flash_byte_read_plus ; read avr low movff temp1,lo - call ext_flash_byte_read_plus ; read avr high + call ext_flash_byte_read_plus ; read avr high movff temp1,hi - movf total_divetime_seconds+1,W ; salinity for this dive - call adjust_depth_with_salinity_log ; computes salinity setting (FROM WREG!) into lo:hi [mbar] + movf total_divetime_seconds+1,W ; salinity for this dive + call adjust_depth_with_salinity_log ; computes salinity setting (FROM WREG!) into lo:hi [mbar] output_16dp .3 - STRCAT_PRINT "m" + STRCAT_PRINT "m" ; Last deco - LOG_POINT_TO log_last_stop + LOG_POINT_TO log_last_stop WIN_SMALL .5,.190 STRCPY_TEXT tLastDecostop - call ext_flash_byte_read_plus ; Read last stop + call ext_flash_byte_read_plus ; Read last stop movff temp1,lo output_8 - STRCAT_PRINT "m" + STRCAT_PRINT "m" movlw color_lightblue - call TFT_set_color - WIN_FRAME_COLOR16 .63,.220,.2,.105; Top, Bottom, Left, Right + call TFT_set_color + WIN_FRAME_COLOR16 .63,.220,.2,.105 ; Top, Bottom, Left, Right ; Firmware - call TFT_standard_color + call TFT_standard_color WIN_SMALL .110,.65 - STRCAT "V:" - LOG_POINT_TO log_firmware - call ext_flash_byte_read_plus ; read firmware xx + STRCAT "V:" + LOG_POINT_TO log_firmware + call ext_flash_byte_read_plus ; read firmware xx movff temp1,lo - bsf neg_flag ; set flag for 2.15 or newer - movlw .1 - cpfsgt lo ; >1? - bcf neg_flag ; No, clear flag - movlw .9 - cpfslt lo ; <9? - bcf neg_flag ; No, clear flag (When unit was updgraded from hwOS Sport (10.xx)) + bsf neg_flag ; set flag for 2.15 or newer + movlw .1 + cpfsgt lo ; >1? + bcf neg_flag ; No, clear flag + movlw .9 + cpfslt lo ; <9? + bcf neg_flag ; No, clear flag (When unit was updgraded from hwOS Sport (10.xx)) bsf leftbind output_8 PUTC "." - call ext_flash_byte_read_plus ; read firmware yy + call ext_flash_byte_read_plus ; read firmware yy movff temp1,lo - movlw .14 - cpfsgt lo ; >14? - bcf neg_flag ; No, clear flag + movlw .14 + cpfsgt lo ; >14? + bcf neg_flag ; No, clear flag output_99x - STRCAT_PRINT "" + STRCAT_PRINT "" - btfss neg_flag ; set flag for 2.15 or newer - bra logbook_no_batt_info + btfss neg_flag ; set flag for 2.15 or newer + bra logbook_no_batt_info ; Battery percent (for dives with 2.15 or newer) WIN_SMALL .110,.140 - LOG_POINT_TO log_batt_info ; Battery percent - call ext_flash_byte_read_plus ; read battery low + LOG_POINT_TO log_batt_info ; Battery percent + call ext_flash_byte_read_plus ; read battery low movff temp1,lo output_8 - STRCAT_PRINT "%" + STRCAT_PRINT "%" -logbook_no_batt_info: ; dives with firmware <2.15 +logbook_no_batt_info: ; dives with firmware <2.15 ; Battery voltage WIN_SMALL .110,.90 - STRCAT_PRINT "Batt:" + STRCAT_PRINT "Batt:" WIN_SMALL .110,.115 - LOG_POINT_TO log_battery ; Battery voltage... - call ext_flash_byte_read_plus ; read battery low + LOG_POINT_TO log_battery ; Battery voltage... + call ext_flash_byte_read_plus ; read battery low movff temp1,lo - call ext_flash_byte_read_plus ; read battery high + call ext_flash_byte_read_plus ; read battery high movff temp1,hi output_16dp .2 - STRCAT_PRINT "V" + STRCAT_PRINT "V" ; surface pressure in mbar - LOG_POINT_TO log_surface_press - call ext_flash_byte_read_plus ; read surface pressure + LOG_POINT_TO log_surface_press + call ext_flash_byte_read_plus ; read surface pressure movff temp1,lo - call ext_flash_byte_read_plus ; read surface pressure + call ext_flash_byte_read_plus ; read surface pressure movff temp1,hi WIN_SMALL .110,.165 lfsr FSR2,buffer - bsf leftbind - output_16 ; Air pressure before dive - STRCAT_TEXT tMBAR - clrf WREG - movff WREG,buffer+7 ; limit to 7 chars - STRCAT_PRINT "" + bsf leftbind + output_16 ; Air pressure before dive + STRCAT_TEXT tMBAR + clrf WREG + movff WREG,buffer+7 ; limit to 7 chars + STRCAT_PRINT "" movlw color_greenish - call TFT_set_color - WIN_FRAME_COLOR16 .63,.220,.107,.159; Top, Bottom, Left, Right + call TFT_set_color + WIN_FRAME_COLOR16 .63,.220,.107,.159 ; Top, Bottom, Left, Right - rcall logbook_preloop_tasks ; Clear some flags and set to Speed_eco + rcall logbook_preloop_tasks ; Clear some flags and set to Speed_eco display_details_loop: - btfsc switch_left ; SET/MENU? - bra logbook_page3 ; Details, 2nd page - btfsc switch_right ; ENTER? - bra exit_profileview ; back to list + ; REPLACE ## logbook look and feel + ; btfsc switch_left ; SET/MENU? + ; BY + btfsc switch_right + bra logbook_page3 ; Details, 2nd page + ; REPLACE ## logbook look and feel + ; btfsc switch_right ; ENTER? + btfsc switch_left + bra exit_profileview ; back to list rcall log_screendump_and_onesecond ; Check if we need to make a screenshot and check for new second - btfsc sleepmode ; Timeout? - bra exit_profileview ; back to list - bra display_details_loop ; wait for something to do + btfsc sleepmode ; Timeout? + bra exit_profileview ; back to list + bra display_details_loop ; wait for something to do global logbook_preloop_tasks logbook_preloop_tasks: - movlw CCP1CON_VALUE ; See hwos.inc - movwf CCP1CON ; Power-on backlight + movlw CCP1CON_VALUE ; See hwos.inc + movwf CCP1CON ; Power-on backlight call TFT_standard_color - bcf sleepmode ; clear some flags + bcf sleepmode ; clear some flags bcf switch_right bcf switch_left clrf timeout_counter2 - goto speed_normal ; and return + goto speed_normal ; and return logbook_page3: ; Show even more info rcall log_details_header ; Shows number, time/date and basic dive info - ; OC/CC Gas List +; REPLACE ## logbook look and feel +; ; OC/CC Gas List +; LOG_POINT_TO log_divemode +; call ext_flash_byte_read_plus ; 0=OC, 1=CC, 2=Gauge, 3=Apnea into temp1 +; WIN_SMALL .5,.65 +; WIN_COLOR color_greenish +; STRCPY_TEXT_PRINT tGaslist ; "OC Gas List" / tGaslistCC +; BY bcf leftbind - LOG_POINT_TO log_gas1 - movlw color_white ; Color for Gas 1 - call TFT_set_color ; Set Color... + LOG_POINT_TO log_gas1 + movlw color_white ; Color for Gas 1 + call TFT_set_color ; Set Color... WIN_SMALL .5,.90 rcall log_show_gas_common2 - movlw color_green ; Color for Gas 2 - call TFT_set_color ; Set Color... + movlw color_green ; Color for Gas 2 + call TFT_set_color ; Set Color... WIN_SMALL .5,.115 rcall log_show_gas_common2 - movlw color_red ; Color for Gas 3 - call TFT_set_color ; Set Color... + movlw color_red ; Color for Gas 3 + call TFT_set_color ; Set Color... WIN_SMALL .5,.140 rcall log_show_gas_common2 - movlw color_yellow ; Color for Gas 4 - call TFT_set_color ; Set Color... + movlw color_yellow ; Color for Gas 4 + call TFT_set_color ; Set Color... WIN_SMALL .5,.165 rcall log_show_gas_common2 - movlw color_cyan ; Color for Gas 5 - call TFT_set_color ; Set Color... + movlw color_cyan ; Color for Gas 5 + call TFT_set_color ; Set Color... WIN_SMALL .5,.190 rcall log_show_gas_common2 + ; OC/CC Gas List + WIN_SMALL .5,.65 + WIN_COLOR color_greenish + LOG_POINT_TO log_divemode + call ext_flash_byte_read_plus ; 0=OC, 1=CC, 2=Gauge, 3=Apnea into temp1 + decfsz temp1,w ; =1 (CC)? + bra logbook_page3a + STRCPY_TEXT_PRINT tGaslistCC + bra logbook_page3b +logbook_page3a: + STRCPY_TEXT_PRINT tGaslist +logbook_page3b: - ; OC/CC Gas List - WIN_SMALL .5,.65 - WIN_COLOR color_greenish - LOG_POINT_TO log_divemode - call ext_flash_byte_read_plus ; 0=OC, 1=CC, 2=Gauge, 3=Apnea into temp1 - decfsz temp1,w ; =1 (CC)? - bra logbook_page3a - STRCPY_TEXT_PRINT tGaslistCC ; CC - bra logbook_page3b -logbook_page3a: - STRCPY_TEXT_PRINT tGaslist ; OC -logbook_page3b: movlw color_lightblue call TFT_set_color - WIN_FRAME_COLOR16 .63,.220,.2,.90; Top, Bottom, Left, Right + WIN_FRAME_COLOR16 .63,.220,.2,.90 ; Top, Bottom, Left, Right rcall logbook_preloop_tasks ; Clear some flags and set to Speed_eco display_details2_loop: - btfsc switch_left ; SET/MENU? - goto logbook_page4 ; Show more info - btfsc switch_right ; ENTER? - bra exit_profileview ; back to list + ; REPLACE ## logbook look and feel + ; btfsc switch_left ; SET/MENU? + ; BY + btfsc switch_right + goto logbook_page4 ; Show more info + ; REPLACE ## logbook look and feel + ; btfsc switch_right ; ENTER? + ; BY + btfsc switch_left + bra exit_profileview ; back to list rcall log_screendump_and_onesecond ; Check if we need to make a screenshot and check for new second - btfsc sleepmode ; Timeout? - bra exit_profileview ; back to list - bra display_details2_loop ; wait for something to do + btfsc sleepmode ; Timeout? + bra exit_profileview ; back to list + bra display_details2_loop ; wait for something to do logbook_page4: ; Show even more info in CC mode LOG_POINT_TO log_divemode - call ext_flash_byte_read ; 0=OC, 1=CC, 2=Gauge, 3=Apnea into WREG and temp1 - decfsz temp1,w ; =1 (CC)? - goto display_profile2 ; no + call ext_flash_byte_read ; 0=OC, 1=CC, 2=Gauge, 3=Apnea into WREG and temp1 + decfsz temp1,w ; =1 (CC)? + goto display_profile2 ; no - rcall log_details_header ; Shows number, time/date and basic dive info - ; Setpoint list + rcall log_details_header ; Shows number, time/date and basic dive info + ; Setpoint list LOG_POINT_TO log_sp1 WIN_SMALL .5,.65 WIN_COLOR color_greenish @@ -1866,26 +1896,31 @@ movlw color_greenish call TFT_set_color - WIN_FRAME_COLOR16 .63,.220,.2,.112; Top, Bottom, Left, Right + WIN_FRAME_COLOR16 .63,.220,.2,.112 ; Top, Bottom, Left, Right rcall logbook_preloop_tasks ; Clear some flags and set to Speed_eco display_details3_loop: - btfsc switch_left ; SET/MENU? - goto display_profile2 ; Show the profile view again - btfsc switch_right ; ENTER? - bra exit_profileview ; back to list + ; REPLACE ## logbook look and feel + ; btfsc switch_left ; SET/MENU? + ; BY + btfsc switch_right + goto display_profile2 ; Show the profile view again + ; REPLACE ## logbook look and feel + ; btfsc switch_right ; ENTER? + ; BY + btfsc switch_left + bra exit_profileview ; back to list rcall log_screendump_and_onesecond ; Check if we need to make a screenshot and check for new second - btfsc sleepmode ; Timeout? - bra exit_profileview ; back to list - bra display_details3_loop ; wait for something to do - + btfsc sleepmode ; Timeout? + bra exit_profileview ; back to list + bra display_details3_loop ; wait for something to do log_details_header: - clrf CCP1CON ; stop PWM - bcf PORTC,2 ; Pull PWM out to GND + clrf CCP1CON ; stop PWM + bcf PORTC,2 ; Pull PWM out to GND call TFT_boot - ;call TFT_ClearScreen ; Clear screen + ;call TFT_ClearScreen ; Clear screen ; Set ext_flash pointer to "#divesecs-oldest" dive ; compute read_int_eeprom .2 - divesecs @@ -1893,13 +1928,13 @@ ; look in header for pointer to begin of diveprofile (Byte 2-4) ; Set pointer (ext_flash_log_pointer:3) to this address, start drawing - decf divesecs,F ;-1 + decf divesecs,F ;-1 read_int_eeprom .2 movf EEDATA,W bcf STATUS,C - subfwb divesecs,W ; max. dives (low value) - divesecs - movwf lo ; result - incf divesecs,F ;+1 + subfwb divesecs,W ; max. dives (low value) - divesecs + movwf lo ; result + incf divesecs,F ;+1 ; Set ext_flash_address:3 to TOC entry of this dive ; 1st: 200000h-200FFFh -> lo=0 ; 2nd: 201000h-201FFFh -> lo=1 @@ -1910,13 +1945,13 @@ movlw 0x20 movwf ext_flash_address+2 movlw .16 - mulwf lo ; lo*16 = offset to 0x2000 (up:hi) + mulwf lo ; lo*16 = offset to 0x2000 (up:hi) movf PRODL,W addwf ext_flash_address+1,F movf PRODH,W addwfc ext_flash_address+2,F ; pointer at the first 0xFA of header - rcall logbook_show_divenumber ; Show the dive number in medium font + rcall logbook_show_divenumber ; Show the dive number in medium font ; Show date and time in first row WIN_SMALL .59,.10 LOG_POINT_TO log_date @@ -1926,31 +1961,31 @@ movff temp1,convert_value_temp+0 ; Month call ext_flash_byte_read_plus movff temp1,convert_value_temp+1 ; Day - call TFT_convert_date ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2 + call TFT_convert_date ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2 PUTC "-" call ext_flash_byte_read_plus ; hour movff temp1,lo call ext_flash_byte_read_plus ; Minutes movff temp1,hi - output_99x ; hour + output_99x ; hour PUTC ':' movff hi,lo - output_99x ; minute - STRCAT_PRINT "" ; Display 1st row of details + output_99x ; minute + STRCAT_PRINT "" ; Display 1st row of details ; Show max depth and dive time WIN_SMALL .5,.35 STRCAT "Max:" LOG_POINT_TO log_max_depth - call ext_flash_byte_read_plus ; read max depth + call ext_flash_byte_read_plus ; read max depth movff temp1,lo - call ext_flash_byte_read_plus ; read max depth + call ext_flash_byte_read_plus ; read max depth movff temp1,hi - TSTOSS opt_units ; 0=Meters, 1=Feets + TSTOSS opt_units ; 0=Meters, 1=Feets bra logbook_page2_depth_metric ; imperial - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet PUTC ' ' bcf leftbind output_16_3 @@ -1959,7 +1994,7 @@ logbook_page2_depth_metric: bsf leftbind - output_16dp d'3' ; max. depth + output_16dp d'3' ; max. depth STRCAT_TEXT tMeters logbook_page2_depth_common: @@ -1967,29 +2002,29 @@ call ext_flash_byte_read_plus ; divetime in minutes movff temp1,lo call ext_flash_byte_read_plus - movff temp1,hi ; divetime in minutes + movff temp1,hi ; divetime in minutes bsf leftbind - output_16 ; divetime minutes + output_16 ; divetime minutes PUTC "m" LOG_POINT_TO log_divetime+.2 - call ext_flash_byte_read_plus ; read divetime seconds + call ext_flash_byte_read_plus ; read divetime seconds movff temp1,lo bsf leftbind - output_99x ; divetime seconds + output_99x ; divetime seconds call TFT_standard_color STRCAT_PRINT "s" ; ; Dive mode ; LOG_POINT_TO log_divemode -; call ext_flash_byte_read_plus ; Read divemode +; call ext_flash_byte_read_plus ; Read divemode ; movff temp1,lo -; call TFT_display_decotype_surface1 ; "strcat_print"s divemode (OC, CC, APNEA or GAUGE) +; call TFT_display_decotype_surface1 ; "strcat_print"s divemode (OC, CC, APNEA or GAUGE) return log_show_sp_common: lfsr FSR2,buffer - call ext_flash_byte_read_plus ; Read setpoint + call ext_flash_byte_read_plus ; Read setpoint movff temp1,lo clrf hi bsf leftbind @@ -1997,52 +2032,52 @@ bcf leftbind STRCAT_TEXT tbar PUTC " " - call ext_flash_byte_read_plus ; change depth + call ext_flash_byte_read_plus ; change depth movff temp1,lo - TSTOSS opt_units ; 0=Meters, 1=Feets + TSTOSS opt_units ; 0=Meters, 1=Feets bra log_show_sp_common_metric movf lo,W - mullw .100 ; convert meters to mbar + mullw .100 ; convert meters to mbar movff PRODL,lo movff PRODH,hi - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet output_16 - STRCAT_TEXT tFeets ; "ft" + STRCAT_TEXT tFeets ; "ft" bra log_show_sp_common_common log_show_sp_common_metric: output_8 - STRCAT_TEXT tMeters ; "m" + STRCAT_TEXT tMeters ; "m" log_show_sp_common_common: STRCAT_PRINT "" return -log_show_gas_common2: ; as log_show_gas_common but with change depth +log_show_gas_common2: ; as log_show_gas_common but with change depth lfsr FSR2,buffer - call ext_flash_byte_read_plus ; current O2 + call ext_flash_byte_read_plus ; current O2 movff temp1,lo - call ext_flash_byte_read_plus ; current He + call ext_flash_byte_read_plus ; current He movff temp1,hi - call customview_show_mix ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 - call ext_flash_byte_read_plus ; change depth + call customview_show_mix ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 + call ext_flash_byte_read_plus ; change depth movff temp1,lo - TSTOSS opt_units ; 0=Meters, 1=Feets + TSTOSS opt_units ; 0=Meters, 1=Feets bra log_show_gas_common2_metric movf lo,W - mullw .100 ; convert meters to mbar + mullw .100 ; convert meters to mbar movff PRODL,lo movff PRODH,hi - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet output_16 - STRCAT_TEXT tFeets ; "ft" + STRCAT_TEXT tFeets ; "ft" bra log_show_gas_common2_common log_show_gas_common2_metric: output_8 - STRCAT_TEXT tMeters ; "m" + STRCAT_TEXT tMeters ; "m" log_show_gas_common2_common: bcf leftbind - call ext_flash_byte_read_plus ; Gas Type + call ext_flash_byte_read_plus ; Gas Type STRCAT_PRINT "" return
--- a/src/menu_processor.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/menu_processor.asm Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File menu_processor.asm +; File menu_processor.asm REFACTORED VERSION V2.91 ; ; Routines to handle all hwOS graphic/text menus. ; @@ -81,10 +81,11 @@ movff TBLPTRH, menu_block+1 movff TBLPTRU, menu_block+2 - extern TFT_clear_divemode_menu btfss divemode ; In divemode? bra menu_processor0 ; No + ; Required for menus with less entries then the calling menu but not so nice when setting up gas 6.... mH + extern TFT_clear_divemode_menu movlw .1 cpfsgt menupos ; only if menupos=1... call TFT_clear_divemode_menu ; ... Clear the menu! @@ -127,7 +128,7 @@ call TFT_cat_firmware STRCAT_PRINT "" call TFT_standard_color - bcf win_invert + bcf win_invert return ;============================================================================= @@ -354,8 +355,9 @@ btfsc settime_setdate ; In the Set Time or Set Date menu? call TFT_show_time_date_menu ; Yes, update clock - btfsc menu_show_sensors ; In the "Sensors" menu? - call TFT_menu_hud ; Yes, update HUD data + ; DELETE - menu has been deleted ## memory + ; btfsc menu_show_sensors ; In the "Sensors" menu? + ; call TFT_menu_hud ; Yes, update HUD data bcf onesecupdate ; one second updates done @@ -365,21 +367,21 @@ btfsc divemode goto restart ; Enter Divemode if required - btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) + btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) bra menu_line_loop3 - btfsc vusb_in ; USB plugged in? - call comm_mode ; Start COMM mode + btfsc vusb_in ; USB plugged in? + call comm_mode ; Start COMM mode bra menu_line_loop4 menu_line_loop3: - btfss vusb_in ; USB (still) plugged in? - bcf enable_screen_dumps ; No, clear flag + btfss vusb_in ; USB (still) plugged in? + bcf enable_screen_dumps ; No, clear flag call rs232_get_byte btfsc rs232_recieve_overflow bra menu_line_loop4 movlw "l" cpfseq RCREG1 bra menu_line_loop4 - call TFT_dump_screen ; Dump the screen contents + call TFT_dump_screen ; Dump the screen contents menu_line_loop4: bra menu_line_loop @@ -445,12 +447,12 @@ movlw dm_menu_item1_column movff WREG,win_leftx2 clrf start_item - movff item_max,menupos4 ; Copy item_max for divemode cursor routine + movff item_max,menupos4 ; Copy item_max for divemode cursor routine bra menu_draw_lines_2 menu_draw_lines: - btfsc divemode ; in divemode? - bra menu_draw_lines_divemode ; Yes + btfsc divemode ; in divemode? + bra menu_draw_lines_divemode; Yes btfsc menu_flags,0 ; Dynamic title ? rcall menu_processor_title ; YES: redraw it then. @@ -477,7 +479,7 @@ movff start_item, menu_item menu_draw_lines_1: - call TFT_standard_color ; Restore color after disabled lines. + call TFT_standard_color ; Restore color after disabled lines. movf menu_item,W rcall menu_read_item
--- a/src/menu_tree.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/menu_tree.asm Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File menu_tree.asm +; File menu_tree.asm REFACTORED VERSION V2.95 ; ; OSTC menus ; @@ -9,7 +9,7 @@ ; HISTORY ; 2011-07-11 : [jDG] Creation. -#include "hwos.inc" ; Mandatory header +#include "hwos.inc" ; Mandatory header #include "gaslist.inc" #include "menu_processor.inc" #include "start.inc" @@ -18,18 +18,18 @@ #include "tft.inc" #include "eeprom_rs232.inc" #include "external_flash.inc" -#include "shared_definitions.h" ; Mailbox from/to p2_deco.c +#include "shared_definitions.h" ; Mailbox from/to p2_deco.c #include "isr.inc" #include "ghostwriter.inc" #include "adc_lightsensor.inc" #include "wait.inc" #include "i2c.inc" - CBLOCK tmp+0x40 ; Keep space for menu processor - gaslist_gas ; Check ram position in gaslist.asm, too! - ENDC + CBLOCK tmp+0x40 ; Keep space for menu processor + gaslist_gas ; Check ram position in gaslist.asm, too! + ENDC -gui CODE +gui CODE ;============================================================================= ; Main Menu global do_main_menu,do_main_menu2 @@ -58,9 +58,9 @@ MENU_BEGIN tInfoMenu, .6 MENU_DYNAMIC info_menu_serial, 0 MENU_DYNAMIC info_menu_firmware, 0 - MENU_DYNAMIC info_menu_total_dives, 0 - MENU_DYNAMIC info_menu_battery_volts,0 - MENU_DYNAMIC info_menu_uptime,0 + MENU_DYNAMIC info_menu_battery_volts,0 + MENU_DYNAMIC info_menu_uptime, 0 + MENU_DYNAMIC info_menu_total_dives, 0 MENU_CALL tExit, do_return_settings MENU_END @@ -71,47 +71,50 @@ rcall menu_tree_double_pop ; drop exit line and back to last line do_ccr_menu: - bcf menu_show_sensors ; Clear flag bcf menu_show_sensors2 ; Clear flag btfsc analog_o2_input bra do_ccr_menu_cR - btfss optical_input - bra do_ccr_menu_ostc2 + + ; COMMENT OUT - currently there is no difference between the OSTC 2 and 3 regarding this menu + ; btfss optical_input + ; bra do_ccr_menu_ostc2 - MENU_BEGIN tCCRSetup, .6 ; OSTC3 menu - MENU_OPTION tCCRMode, oCCRMode, 0 - MENU_CALL tCCRSensor, do_ccr_sensor - MENU_CALL tDiluentSetup, do_diluent_setup - MENU_CALL tFixedSetpoints, do_fixed_setpoints - MENU_CALL tPSCRMenu, do_PSCR_menu - MENU_CALL tExit, do_continue_main_menu + MENU_BEGIN tCCRSetup, .6 ; OSTC3 menu (and currently also the OSTC2 menu) + MENU_OPTION tCCRMode, oCCRMode, 0 + MENU_CALL tDiluentSetup, do_diluent_setup + MENU_CALL tFixedSetpoints, do_fixed_setpoints + MENU_CALL tPSCRMenu, do_PSCR_menu + MENU_OPTION tCCmaxFracO2, oCCmaxFracO2, 0 + MENU_CALL tExit, do_continue_main_menu MENU_END do_ccr_menu_cR: ; cR menu MENU_BEGIN tCCRSetup, .7 - MENU_OPTION tCCRMode, oCCRMode, 0 - MENU_CALL tCCRSensor, do_ccr_sensor - MENU_CALL tCalibrateMenu, do_calibrate_menu - MENU_CALL tDiluentSetup, do_diluent_setup - MENU_CALL tFixedSetpoints, do_fixed_setpoints - MENU_CALL tPSCRMenu, do_PSCR_menu - MENU_CALL tExit, do_continue_main_menu + MENU_OPTION tCCRMode, oCCRMode, 0 + MENU_CALL tCalibrateMenu, do_calibrate_menu + MENU_CALL tDiluentSetup, do_diluent_setup + MENU_CALL tFixedSetpoints, do_fixed_setpoints + MENU_CALL tPSCRMenu, do_PSCR_menu + MENU_OPTION tCCmaxFracO2, oCCmaxFracO2, 0 + MENU_CALL tExit, do_continue_main_menu MENU_END -do_ccr_menu_ostc2: - MENU_BEGIN tCCRSetup, .5 ; ostc2 menu - MENU_OPTION tCCRMode, oCCRMode, 0 - MENU_CALL tDiluentSetup, do_diluent_setup - MENU_CALL tFixedSetpoints, do_fixed_setpoints - MENU_CALL tPSCRMenu, do_PSCR_menu - MENU_CALL tExit, do_continue_main_menu - MENU_END +; COMMENT OUT - currently there is no difference between the OSTC 2 and 3 regarding this menu +;do_ccr_menu_ostc2: +; MENU_BEGIN tCCRSetup, .6 ; ostc2 menu +; MENU_OPTION tCCRMode, oCCRMode, 0 +; MENU_CALL tDiluentSetup, do_diluent_setup +; MENU_CALL tFixedSetpoints, do_fixed_setpoints +; MENU_CALL tPSCRMenu, do_PSCR_menu +; MENU_OPTION tCCmaxFracO2, oCCmaxFracO2, 0 +; MENU_CALL tExit, do_continue_main_menu +; MENU_END do_PSCR_menu: - MENU_BEGIN tPSCRMenu, .3 ; PSCR Menu - MENU_OPTION tPSCR_O2_drop, oPSCR_drop, 0 - MENU_OPTION tPSCR_lungratio,oPSCR_lungratio, 0 - MENU_CALL tExit, return_ccr_menu + MENU_BEGIN tPSCRMenu, .3 ; PSCR Menu + MENU_OPTION tPSCR_O2_drop, oPSCR_drop, 0 + MENU_OPTION tPSCR_lungratio, oPSCR_lungratio, 0 + MENU_CALL tExit, return_ccr_menu MENU_END do_calibrate_menu: @@ -119,12 +122,12 @@ bsf menu_show_sensors2 ; Set flag do_calibrate_menu2: MENU_BEGIN tCalibrateMenu, .6 - MENU_CALL tDiveHudMask1, 0 - MENU_CALL tDiveHudMask2, 0 - MENU_CALL tDiveHudMask3, 0 - MENU_OPTION tCalibrationGas,oCalGasO2, 0 - MENU_CALL tCalibrate, do_calibrate_mix - MENU_CALL tExit, return_ccr_menu + MENU_CALL tDiveHudMask1, 0 + MENU_CALL tDiveHudMask2, 0 + MENU_CALL tDiveHudMask3, 0 + MENU_OPTION tCalibrationGas,oCalGasO2, 0 + MENU_CALL tCalibrate, do_calibrate_mix + MENU_CALL tExit, return_ccr_menu MENU_END do_calibrate_mix: @@ -132,19 +135,9 @@ call calibrate_mix ; Calibrate with opt_calibration_O2_ratio, also calibrate S8 HUD if connected WAITMS d'250' ; Wait for HUD v3 movlw .9 - movwf customview_surfmode ; show sensor mV custom view after restart + movwf customview_surfmode ; show sensor mV custom view after restart goto restart ; Restart into surface mode -do_ccr_sensor: - call enable_ir_s8 ; Enable IR/S8-Port - bsf menu_show_sensors ; Set flag - MENU_BEGIN tCCRSensor, .5 - MENU_CALL tDiveHudMask1, 0 - MENU_CALL tDiveHudMask2, 0 - MENU_CALL tDiveHudMask3, 0 - MENU_OPTION tSensorFallback,oSensorFallback, 0 - MENU_CALL tExit, return_ccr_menu - MENU_END do_diluent_setup: bsf ccr_diluent_setup ; =1: Setting up Diluents ("Gas6-10") @@ -164,7 +157,7 @@ do_fixed_setpoints: bcf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint - MENU_BEGIN tFixedSetpoints, .6 + MENU_BEGIN tFixedSetpoints, .6 MENU_DYNAMIC gaslist_strcat_setpoint, do_edit_sp_menu MENU_DYNAMIC gaslist_strcat_setpoint, do_edit_sp_menu MENU_DYNAMIC gaslist_strcat_setpoint, do_edit_sp_menu @@ -211,7 +204,7 @@ do_edit_gas_menu: call gaslist_setgas ; Save current item. do_edit_gas_menu_1: ; Keep current gas. - MENU_BEGIN tGasEdit, .6 + MENU_BEGIN tGasEdit, .6 MENU_DYNAMIC gaslist_gastitle, 0 MENU_DYNAMIC gaslist_MOD_END, 0 MENU_DYNAMIC gaslist_show_type, gaslist_toggle_type @@ -235,7 +228,7 @@ call menu_processor_pop ; drop exit line. goto menu_processor_pop ; back to last gas and return - + global do_gas_depth_menu do_gas_depth_menu: movff gaslist_gas,WREG @@ -257,6 +250,7 @@ MENU_CALL tExit, return_gas_depth MENU_END + ;============================================================================= ; Simulator menus @@ -278,20 +272,21 @@ do_planner_menu: extern do_demo_planner MENU_BEGIN tPlan, .7 + MENU_OPTION tIntvl, odiveInterval, 0 + MENU_OPTION tBtDep, obottomDepth, 0 MENU_CALL tInter, do_demo_divemode - MENU_OPTION tIntvl, odiveInterval, 0 MENU_OPTION tBtTm, obottomTime, 0 - MENU_OPTION tMxDep, obottomDepth, 0 + MENU_CALL tDecoSetup, do_planner_config MENU_CALL tDeco, do_demo_planner - MENU_CALL tSystSets, do_planner_config MENU_CALL tExit, do_continue_main_menu MENU_END + do_planner_config: MENU_BEGIN tPlan, .3 - MENU_OPTION tSetBotUse, obottom_usage, 0 - MENU_OPTION tSetDecoUse, odeco_usage, 0 - MENU_CALL tExit, do_planner_menu + MENU_OPTION tSelectSetpoint,oSimSetpoint, 0 + MENU_OPTION tuseAGF, oSimAGF, 0 + MENU_CALL tExit, do_planner_menu MENU_END @@ -306,17 +301,19 @@ MENU_OPTION tDvMode, oDiveMode, 0 MENU_OPTION tDkMode, oDecoMode, 0 MENU_CALL tppO2settings, do_ppo2_menu - MENU_OPTION tsafetystopmenu,oSafetyStop, 0 - MENU_OPTION tFTTSMenu, oExtraTime,0 + MENU_OPTION tsafetystopmenu,oSafetyStop, 0 + MENU_CALL t2ndDecoPlanMenu, do_2nd_deco_plan_menu MENU_CALL tDecoparameters, do_decoparameters_menu MENU_CALL tExit, do_continue_main_menu MENU_END do_ppo2_menu: - MENU_BEGIN tppO2settings, .5 - MENU_DYNAMIC divesets_ppo2_max, do_toggle_ppo2_max - MENU_DYNAMIC divesets_ppo2_max_deco, do_toggle_ppo2_max_deco - MENU_DYNAMIC divesets_ppo2_min, do_toggle_ppo2_min + MENU_BEGIN tppO2settings, .6 + + MENU_DYNAMIC divesets_ppo2_max, do_toggle_ppo2_max + MENU_DYNAMIC divesets_ppo2_max_deco, do_toggle_ppo2_max_deco + MENU_DYNAMIC divesets_ppo2_min, do_toggle_ppo2_min + MENU_DYNAMIC divesets_ppo2_min_cc, do_toggle_ppo2_min_cc MENU_OPTION tShowppO2, oShowppO2, 0 MENU_CALL tExit, do_return_divemode_menu MENU_END @@ -334,6 +331,47 @@ MENU_CALL tExit, do_return_divemode_menu MENU_END + +do_return_2nd_deco_plan_menu: + rcall menu_tree_double_pop ; drop exit line and back to last line + + +do_2nd_deco_plan_menu + MENU_BEGIN t2ndDecoPlanMenu, .7 + MENU_OPTION tFTTSMenu, oExtraTime, 0 + MENU_OPTION tCalcAscGas, oCalcAscGas, 0 + MENU_OPTION tSetBotUse, obottom_usage, 0 + MENU_OPTION tSetDecoUse, odeco_usage, 0 + MENU_CALL tTankSizes, do_tank_sizes_menu + MENU_CALL tTankFillPress, do_tank_fill_press_menu + MENU_CALL tExit, do_return_divemode_menu + MENU_END + + + +do_tank_sizes_menu: + MENU_BEGIN tTankSizes, .6 + MENU_OPTION tGas1, oTankSize1, 0 + MENU_OPTION tGas2, oTankSize2, 0 + MENU_OPTION tGas3, oTankSize3, 0 + MENU_OPTION tGas4, oTankSize4, 0 + MENU_OPTION tGas5, oTankSize5, 0 + MENU_CALL tExit, do_return_2nd_deco_plan_menu + MENU_END + + + +do_tank_fill_press_menu: + MENU_BEGIN tTankFillPress, .6 + MENU_OPTION tGas1, oTankFillPres1, 0 + MENU_OPTION tGas2, oTankFillPres2, 0 + MENU_OPTION tGas3, oTankFillPres3, 0 + MENU_OPTION tGas4, oTankFillPres4, 0 + MENU_OPTION tGas5, oTankFillPres5, 0 + MENU_CALL tExit, do_return_2nd_deco_plan_menu + MENU_END + + do_aGF_menu: MENU_BEGIN taGFMenu, .4 MENU_OPTION taGF_enable,oEnable_aGF, 0 @@ -341,14 +379,16 @@ MENU_OPTION taGF_high, oaGF_high, 0 MENU_CALL tExit, do_return_decoparameters_menu MENU_END + + ;============================================================================= ; Setup Menu do_return_settings: - bcf settime_setdate ; Clear flag + bcf settime_setdate ; Clear flag rcall menu_tree_double_pop ; drop exit line and back to last line - extern compass_calibration_loop + extern compass_calibration_loop do_settings_menu: btfsc ble_available ; ble available bra do_settings_menu_ble ; Yes. @@ -356,18 +396,18 @@ MENU_CALL tInfoMenu, do_info_menu MENU_CALL tSetTimeDate, do_date_time_menu MENU_CALL tDispSets, do_dispsets_menu - MENU_OPTION tLanguage, oLanguage, 0 + MENU_OPTION tAltMode, oAltMode, 0 MENU_CALL tMore, do_settings_menu_more MENU_CALL tExit, do_continue_main_menu MENU_END do_settings_menu_ble: - MENU_BEGIN tSystSets, .7 + MENU_BEGIN tSystSets, .7 MENU_CALL tInfoMenu, do_info_menu MENU_CALL tBleTitle, comm_mode0 MENU_CALL tSetTimeDate, do_date_time_menu MENU_CALL tDispSets, do_dispsets_menu - MENU_OPTION tLanguage, oLanguage, 0 + MENU_OPTION tAltMode, oAltMode, 0 MENU_CALL tMore, do_settings_menu_more MENU_CALL tExit, do_continue_main_menu MENU_END @@ -376,18 +416,18 @@ rcall menu_tree_double_pop ; drop exit line and back to last line do_settings_menu_more: - btfsc battery_gauge_available ; piezo buttons available + btfsc battery_gauge_available ; piezo buttons available bra do_settings_menu_more_piezo - btfsc ble_available ; ble available + btfsc ble_available ; ble available bra do_settings_menu_more_ostc3p MENU_BEGIN tSystSets, .7 - MENU_CALL tCompassMenu, do_compass_menu - MENU_CALL tLogOffset, do_log_offset_menu - MENU_OPTION tUnits, oUnits, 0 - MENU_OPTION tSamplingrate,oSamplingRate,0 - MENU_OPTION tDvSalinity,oDiveSalinity, 0 - MENU_CALL tResetMenu, do_reset_menu - MENU_CALL tExit, do_return_settings + MENU_CALL tCompassMenu, do_compass_menu + MENU_CALL tLogOffset, do_log_offset_menu + MENU_OPTION tUnits, oUnits, 0 + MENU_OPTION tLanguage, oLanguage, 0 + MENU_OPTION tDvSalinity, oDiveSalinity, 0 + MENU_CALL tResetMenu, do_reset_menu + MENU_CALL tExit, do_return_settings MENU_END do_settings_menu_more_piezo_exit: @@ -397,13 +437,13 @@ do_settings_menu_more_piezo: MENU_BEGIN tSystSets, .7 - MENU_CALL tCompassMenu, do_compass_menu - MENU_CALL tLogOffset, do_log_offset_menu - MENU_OPTION tUnits, oUnits, 0 - MENU_OPTION tSamplingrate,oSamplingRate,0 - MENU_OPTION tDvSalinity,oDiveSalinity, 0 - MENU_CALL tMore, do_settings_piezo_menu - MENU_CALL tExit, do_return_settings + MENU_CALL tCompassMenu, do_compass_menu + MENU_CALL tLogOffset, do_log_offset_menu + MENU_OPTION tUnits, oUnits, 0 + MENU_OPTION tLanguage, oLanguage, 0 + MENU_OPTION tDvSalinity, oDiveSalinity, 0 + MENU_CALL tMore, do_settings_piezo_menu + MENU_CALL tExit, do_return_settings MENU_END extern comm_mode0 @@ -411,19 +451,19 @@ do_settings_piezo_menu: ; Menu with features only available in piezo button hardware MENU_BEGIN tSystSets, .4 - MENU_CALL tResetMenu, do_reset_menu - MENU_OPTION tButtonleft,ocR_button_left ,0 ; left button sensitivity - MENU_OPTION tButtonright,ocR_button_right,0 ; right button sensitivity + MENU_CALL tResetMenu, do_reset_menu + MENU_OPTION tButtonleft, ocR_button_left, 0 ; left button sensitivity + MENU_OPTION tButtonright, ocR_button_right, 0 ; right button sensitivity MENU_CALL tExit, do_settings_menu_more_piezo_exit MENU_END do_settings_menu_more_ostc3p: ; Menu with BLE feature MENU_BEGIN tSystSets, .7 - MENU_CALL tCompassMenu, do_compass_menu - MENU_CALL tLogOffset, do_log_offset_menu - MENU_OPTION tUnits, oUnits, 0 - MENU_OPTION tSamplingrate,oSamplingRate,0 - MENU_OPTION tDvSalinity,oDiveSalinity, 0 + MENU_CALL tCompassMenu, do_compass_menu + MENU_CALL tLogOffset, do_log_offset_menu + MENU_OPTION tUnits, oUnits, 0 + MENU_OPTION tLanguage, oLanguage, 0 + MENU_OPTION tDvSalinity, oDiveSalinity, 0 MENU_CALL tResetMenu, do_reset_menu MENU_CALL tExit, do_return_settings MENU_END @@ -431,11 +471,11 @@ do_compass_menu: MENU_BEGIN tSystSets, .5 MENU_CALL tCompassMenu, compass_calibration_loop -; MENU_OPTION tCompassGain, oCompassGain, 0 - MENU_DYNAMIC menu_cal_x, 0 - MENU_DYNAMIC menu_cal_y, 0 - MENU_DYNAMIC menu_cal_z, 0 - MENU_CALL tExit, do_return_settings_more +; MENU_OPTION tCompassGain, oCompassGain, 0 + MENU_DYNAMIC menu_cal_x, 0 + MENU_DYNAMIC menu_cal_y, 0 + MENU_DYNAMIC menu_cal_z, 0 + MENU_CALL tExit, do_return_settings_more MENU_END ;============================================================================= @@ -443,36 +483,36 @@ do_reset_menu: MENU_BEGIN tResetMenu, .6 - MENU_CALL tExit, do_return_settings - MENU_CALL tReboot, do_reset_menu2 ; Confirm - MENU_CALL tResetDeco, do_reset_menu3 ; Confirm - MENU_CALL tResetSettings, do_reset_menu4 ; Confirm - MENU_CALL tResetLogbook, do_reset_menu5 ; Confirm - MENU_CALL tResetBattery, new_battery_menu ; New Battery submenu + MENU_CALL tExit, do_return_settings + MENU_CALL tReboot, do_reset_menu2 ; Confirm + MENU_CALL tResetDeco, do_reset_menu3 ; Confirm + MENU_CALL tResetSettings, do_reset_menu4 ; Confirm + MENU_CALL tResetLogbook, do_reset_menu5 ; Confirm + MENU_CALL tResetBattery, new_battery_menu ; New Battery sub menu MENU_END do_reset_menu2: MENU_BEGIN tResetMenu2, .2 - MENU_CALL tAbort, do_continue_menu_3stack - MENU_CALL tReboot, do_reboot ; Reboot + MENU_CALL tAbort, do_continue_menu_3stack + MENU_CALL tReboot, do_reboot ; Reboot MENU_END do_reset_menu3: MENU_BEGIN tResetMenu2, .2 - MENU_CALL tAbort, do_continue_menu_3stack - MENU_CALL tResetDeco, do_reset_deco ; Reset Deco + MENU_CALL tAbort, do_continue_menu_3stack + MENU_CALL tResetDeco, do_reset_deco ; Reset Deco MENU_END do_reset_menu4: MENU_BEGIN tResetMenu2, .2 - MENU_CALL tAbort, do_continue_menu_3stack - MENU_CALL tResetSettings, do_reset_settings ; Reset all settings + MENU_CALL tAbort, do_continue_menu_3stack + MENU_CALL tResetSettings, do_reset_settings ; Reset all settings MENU_END do_reset_menu5: MENU_BEGIN tResetMenu2, .2 - MENU_CALL tAbort, do_continue_menu_3stack - MENU_CALL tResetLogbook, do_reset_logbook ; Reset logbook + MENU_CALL tAbort, do_continue_menu_3stack + MENU_CALL tResetLogbook, do_reset_logbook ; Reset logbook MENU_END do_reset_logbook: @@ -493,39 +533,31 @@ do_reset_deco: - movlw d'79' ; 79% N2 - movff WREG,char_I_N2_ratio - movlw d'0' - movff WREG,char_I_step_is_1min ; 2 second deco mode - SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; copy for deco routine - movff int_I_pres_respiration+0,int_I_pres_surface+0 ; copy for desat routine - movff int_I_pres_respiration+1,int_I_pres_surface+1 - - extern deco_reset - call deco_reset - call deco_calc_desaturation_time ; calculate desaturation time - banksel common - call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode - banksel common - clrf nofly_time+0 ; Reset NoFly - clrf nofly_time+1 - clrf desaturation_time+0 ; Reset Desat - clrf desaturation_time+1 + SAFE_2BYTE_COPY last_surfpressure_30min,int_I_pres_respiration ; copy surface pressure to deco routine + SAFE_2BYTE_COPY last_surfpressure_30min,int_I_pres_surface ; copy surface pressure to deco routine + + call deco_clear_tissue ; set all tissues to Pamb * N2_ratio (C-Code) + banksel common ; back to bank 1, needed after every return from C code + + call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode + call deco_calc_desaturation_time ; calculate desaturation and no-fly time + banksel common + goto do_return_settings ; back to menu do_reset_settings: call TFT_ClearScreen ; Clear screen banksel common extern option_reset_all - call option_reset_all ; Reset all options to factory default. - goto restart ; Restart into surfacemode + call option_reset_all ; Reset all options to factory default. + goto restart ; Restart into surfacemode -do_continue_menu_3stack: ; Return three levels deep +do_continue_menu_3stack: ; Return three levels deep call menu_processor_pop goto do_return_settings do_reboot: - call ext_flash_enable_protection ; Enables write protection + call ext_flash_enable_protection ; Enables write protection reset @@ -543,14 +575,14 @@ MENU_OPTION tSetDay, oSetDay, 0 MENU_OPTION tSetMonth, oSetMonth, 0 MENU_OPTION tSetYear, oSetYear, 0 - MENU_CALL tExit, do_continue_menu_3stack + MENU_CALL tExit, do_continue_menu_3stack MENU_END do_reset_seconds: clrf secs extern rtc_set_rtc - call rtc_set_rtc ; writes mins,sec,hours,day,month and year to rtc module + call rtc_set_rtc ; writes mins,sec,hours,day,month and year to rtc module do_time_menu: bsf settime_setdate MENU_BEGIN tSetTime, .4 @@ -561,8 +593,8 @@ MENU_END -do_toggle_ppo2_max: ; add 0.1bar, with hard-coded max. - movff opt_ppO2_max,lo ; banksafe +do_toggle_ppo2_max: ; add 0.1bar, with hard-coded max. + movff char_I_ppO2_max,lo ; banksafe movlw .10 addwf lo,F movlw ppo2_highest_setting @@ -571,11 +603,11 @@ movlw .120 movwf lo do_toggle_ppo2_max2: - movff lo,opt_ppO2_max + movff lo,char_I_ppO2_max return -do_toggle_ppo2_max_deco: ; add 0.1bar, with hard-coded max. - movff opt_ppO2_max_deco,lo ; banksafe +do_toggle_ppo2_max_deco: ; add 0.1bar, with hard-coded max. + movff char_I_ppO2_max_deco,lo ; banksafe movlw .10 addwf lo,F movlw ppo2_highest_setting_deco @@ -584,11 +616,11 @@ movlw .120 movwf lo do_toggle_ppo2_max_deco2: - movff lo,opt_ppO2_max_deco + movff lo,char_I_ppO2_max_deco return do_toggle_ppo2_min: ; sub 0.1bar, with hard-coded min. - movff opt_ppO2_min,lo ; banksafe + movff char_I_ppO2_min,lo ; banksafe incf lo,F movlw .21 cpfsgt lo @@ -596,9 +628,21 @@ movlw ppo2_lowest_setting movwf lo do_toggle_ppo2_min2: - movff lo,opt_ppO2_min + movff lo,char_I_ppO2_min return +do_toggle_ppo2_min_cc: ; sub 0.1bar, with hard-coded min. + movff char_I_ppO2_min_loop,lo ; banksafe + incf lo,F + movlw ppo2_warning_low_cc_max + cpfsgt lo + bra do_toggle_ppo2_min_cc2 + movlw ppo2_warning_low_cc_min + movwf lo +do_toggle_ppo2_min_cc2: + movff lo,char_I_ppO2_min_loop + return + ; Logbook offset sub-menu do_log_offset_menu: @@ -652,23 +696,25 @@ do_dispsets_menu_3stack: bcf in_color_menu - rcall menu_tree_double_pop ; drop exit line and back to last line + call menu_tree_double_pop ; drop exit line and back to last line do_dispsets_menu: - MENU_BEGIN tDispSets, .5 + MENU_BEGIN tDispSets, .6 MENU_OPTION tBright, oBrightness, 0 MENU_CALL tColorScheme, do_color_scheme + MENU_OPTION tLanguage, oLanguage, 0 MENU_OPTION tFlip, oFlipScreen, 0 MENU_CALL tMore, do_dispsets_menu_more MENU_CALL tExit, do_return_settings MENU_END do_dispsets_menu_more: - MENU_BEGIN tDispSets, .5 - MENU_OPTION tMODwarning, oMODwarning, 0 - MENU_OPTION tVSItext2, oVSItextv2, 0 - MENU_OPTION tVSIgraph, oVSIgraph, 0 - MENU_OPTION tTimeoutDive, oDiveTimeout, 0 + MENU_BEGIN tDispSets, .6 + MENU_OPTION tMODwarning, oMODwarning, 0 + MENU_OPTION tIBCDwarning, oEnable_IBCD, 0 + MENU_OPTION tVSItext2, oVSItextv2, 0 + MENU_OPTION tVSIgraph, oVSIgraph, 0 + MENU_OPTION tTimeoutDive, oDiveTimeout, 0 MENU_CALL tExit, do_dispsets_menu_3stack MENU_END @@ -749,41 +795,41 @@ menu_new_battery_AA_16650: MENU_BEGIN tNewBattTitle, .5 - MENU_CALL tNewBattOld, use_old_batteries - MENU_CALL tNewBattNew36, use_new_36V_batteries - MENU_CALL tNewBattNew15, use_new_15V_batteries - MENU_CALL tNewBattAccu, use_36V_rechargeable - MENU_CALL tNew16650, use_16650_battery + MENU_CALL tNewBattOld, use_old_batteries + MENU_CALL tNewBattNew36, use_new_36V_batteries + MENU_CALL tNewBattNew15, use_new_15V_batteries + MENU_CALL tNewBattAccu, use_36V_rechargeable + MENU_CALL tNew16650, use_16650_battery MENU_END menu_new_battery_AA: MENU_BEGIN tNewBattTitle, .4 - MENU_CALL tNewBattOld, use_old_batteries - MENU_CALL tNewBattNew36, use_new_36V_batteries - MENU_CALL tNewBattNew15, use_new_15V_batteries - MENU_CALL tNewBattAccu, use_36V_rechargeable + MENU_CALL tNewBattOld, use_old_batteries + MENU_CALL tNewBattNew36, use_new_36V_batteries + MENU_CALL tNewBattNew15, use_new_15V_batteries + MENU_CALL tNewBattAccu, use_36V_rechargeable MENU_END menu_new_battery_18650: MENU_BEGIN tNewBattTitle, .2 - MENU_CALL tNewBattOld, use_old_batteries - MENU_CALL tNew18650, use_18650_battery + MENU_CALL tNewBattOld, use_old_batteries + MENU_CALL tNew18650, use_18650_battery MENU_END global use_old_prior_209 use_old_prior_209: clrf EEADRH - read_int_eeprom 0x0F ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah - incfsz EEDATA,F ; Was 0xFF? - return ; No, done. + read_int_eeprom 0x0F ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah + incfsz EEDATA,F ; Was 0xFF? + return ; No, done. - call lt2942_get_status ; Check for gauge IC - movlw .3 ; Assume a 18650 + call lt2942_get_status ; Check for gauge IC + movlw .3 ; Assume a 18650 btfss battery_gauge_available ; cR/2 hardware? - movlw .1 ; Assume a Saft + movlw .1 ; Assume a Saft movwf EEDATA - write_int_eeprom 0x0F ; Store the new battery type into EEPROM + write_int_eeprom 0x0F ; Store the new battery type into EEPROM return global use_old_batteries @@ -802,10 +848,10 @@ read_int_eeprom 0x0C movff EEDATA,battery_gauge+5 read_int_eeprom 0x0F - movff EEDATA,battery_type; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah + movff EEDATA,battery_type ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah rcall setup_new_saft ; Any other value - incf EEDATA,F ; 1 ... 5 + incf EEDATA,F ; 1 ... 5 dcfsnz EEDATA,F rcall setup_new_15v ;=0 dcfsnz EEDATA,F @@ -824,7 +870,7 @@ bsf charge_disable bcf TRISE,2 movlw .100 - movwf batt_percent ; To have 1,5V batteries right after firmware update + movwf batt_percent ; To have 1,5V batteries right after firmware update movlw .0 movff WREG,battery_type return @@ -921,11 +967,11 @@ use_new_15V_batteries: rcall setup_new_15v use_new_36V_2: - call reset_battery_pointer ; Resets battery pointer 0x07-0x0C and battery_gauge:5 - goto surfloop ; Jump to Surfaceloop! + call reset_battery_pointer ; Resets battery pointer 0x07-0x0C and battery_gauge:5 + goto surfloop ; Jump to Surface loop! use_36V_rechargeable: rcall setup_new_panasonic call reset_battery_internal_only - goto surfloop ; Jump to Surfaceloop! + goto surfloop ; Jump to Surface loop! END \ No newline at end of file
--- a/src/option_table.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/option_table.asm Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File option_table.asm +; File option_table.asm REFACTORED VERSION V2.95 ; ; The option table ; @@ -45,6 +45,16 @@ dw register ENDM +; NEW ## deco engine +OPTION_UINT8p5 MACRO lbl, min, max, default, unit, eeprom, register + global lbl +lbl: db 0, default ; Type0 = INT8 + db .5, min + db max, eeprom + dw unit + dw register + ENDM + OPTION_UINT8p10 MACRO lbl, min, max, default, unit, eeprom, register global lbl lbl: db 0, default ; Type0 = INT8 @@ -85,8 +95,30 @@ extern char_I_dive_interval, char_I_bottom_time, char_I_bottom_depth extern char_I_deco_model, char_I_saturation_multiplier, char_I_desaturation_multiplier extern char_I_extra_time - extern tDefName - extern char_I_bottom_usage,char_I_deco_usage,tLitersMinute + extern tDefName, tblank + extern char_I_bottom_usage, char_I_deco_usage, tLitersMinute + + ; NEW ## deco engine + extern char_I_PSCR_drop, char_I_PSCR_lungratio + + ; NEW ## bailout gas needs + extern char_I_tank_size, char_I_tank_pres_fill, tLiter, tbar10 + + ; NEW ## CCR max ppO2 limiter + extern char_I_cc_max_frac_o2 + + ; NEW ## no fly altitude + extern char_I_altitude_wait + + ; NEW ## V2.94 + extern char_I_ppO2_max, char_I_ppO2_min, char_I_ppO2_max_deco, char_I_ppO2_min_loop + + ; NEW ## V2.94 / V2.95 + extern char_I_ascent_speed, tMeterMinute + + ; NEW ## V2.95 + extern char_I_gas_change_time, tmin + ; Option table ; OPTION_UINT8 Label, min, max, default, text-string, EEPROM location (-1 for RAM only), RAM location global option_table_begin @@ -98,18 +130,18 @@ OPTION_UINT8p3 obottomDepth, .12,.120, .21, tMeters, -1, char_I_bottom_depth OPTION_ENUM8 oDiveMode, 5, 0, tDvOC, .8, opt_dive_mode ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR OPTION_ENUM8 oDecoMode, 2, 1, tZHL16, .9, char_I_deco_model ; 0 = ZH-L16, 1 = ZH-L16-GF - OPTION_UINT8p10 oPPO2Max, .120, ppo2_warning_high, .160, 0, .10, opt_ppO2_max + OPTION_UINT8p10 oPPO2Max, .120, ppo2_warning_high, .160, 0, .10, char_I_ppO2_max OPTION_UINT8 oLastDeco, .3, .6, .3, tMeters, .11, opt_last_stop OPTION_UINT8 oGF_low, .10, .100, .30, tPercent, .12, opt_GF_low OPTION_UINT8 oGF_high, .45, .110, .85, tPercent, .13, opt_GF_high - OPTION_UINT8p10 osatmult, .100, .140, .110,tPercent, .14, char_I_saturation_multiplier - OPTION_UINT8p10 odesatmult, .60, .100, .90,tPercent, .15, char_I_desaturation_multiplier - OPTION_UINT8p10 oPPO2Min, .16, ppo2_warning_low, .19, 0, .16, opt_ppO2_min + OPTION_UINT8p5 osatmult, .100, .140, .110,tPercent, .14, char_I_saturation_multiplier + OPTION_UINT8p5 odesatmult, .60, .100, .90,tPercent, .15, char_I_desaturation_multiplier + OPTION_UINT8p10 oPPO2Min, .16, ppo2_warning_low, .19, 0, .16, char_I_ppO2_min OPTION_UINT8 oaGF_low, .10, .100, .30, tPercent, .17, opt_aGF_low OPTION_UINT8 oaGF_high, .45, .110, .85, tPercent, .18, opt_aGF_high OPTION_BOOL oEnable_aGF, 0, .19, opt_enable_aGF ; =1: aGF can be selected underwater OPTION_UINT8 oCompassGain, 0, 7, 6, tMinutes, .20, opt_compass_gain ; 0-7 (230LSB/Gauss to 1370LSB/Gauss) - OPTION_ENUM8 oSamplingRate, 2, 0, tSampling2s, .21, opt_sampling_rate ; =1: 10s, =0: 2s + OPTION_ENUM8 oSamplingRate, 2, 0, tSetSeconds, .21, opt_sampling_rate ; =1: 10s, =0: 2s ;============================================================================= ; Managing Settings @@ -117,12 +149,13 @@ OPTION_ENUM8 oBrightness, 3, 0, tEco, .23, opt_brightness ; =0: Eco, =1:Medium, =2:Full OPTION_UINT8 oDiveSalinity, 0, 4, 0, tPercent, .24, opt_salinity ; 0-4% OPTION_ENUM8 oCCRMode, 3, 0, tCCRModeFixedSP, .25, opt_ccr_mode ; =0: Fixed SP, =1: Sensor, =2: Auto SP - IFNDEF french_italian - OPTION_ENUM8 oLanguage, 2, 0, tEnglish, .26, opt_language ; 0=EN, 1=DE - ELSE - OPTION_ENUM8 oLanguage, 2, 0, tFrench, .26, opt_language ; 0=FR, 1=IT - ENDIF - OPTION_ENUM8 oDateFormat, 3, 1, tDateformat,.27, opt_dateformat ; =0:MMDDYY, =1:DDMMYY, =2:YYMMDD + + IFNDEF french_italian + OPTION_ENUM8 oLanguage, 2, 0, tEnglish, .26, opt_language ; 0=EN, 1=DE + ELSE + OPTION_ENUM8 oLanguage, 2, 0, tFrench, .26, opt_language ; 0=FR, 1=IT + ENDIF + OPTION_ENUM8 oDateFormat, 3, 1, tDateformat,.27, opt_dateformat ; =0:MMDDYY, =1:DDMMYY, =2:YYMMDD OPTION_ENUM8 oUnits, 2, 0, tMetric, .28, opt_units ; 0=Meters, 1=Feets ;============================================================================= @@ -193,29 +226,48 @@ ;============================================================================= ; Misc - OPTION_ENUM8 oColorSetDive, 4, 0, tColorSetName0, .146, opt_dive_color_scheme ; Color scheme divemode - OPTION_UINT8 oPressureAdjust, .0,.255, .0, -1, .147, opt_pressure_adjust ; SIGNED int (-20/+20mbar max.) - OPTION_BOOL oSafetyStop, 0, .148, opt_enable_safetystop ; =1: A safety stop is shown - OPTION_UINT8 oCalGasO2, .21,.100, .21, tPercent, .149, opt_calibration_O2_ratio ; Calibration gas %O2 (Do not move in EEPROM, must stay at .149!) - OPTION_BOOL oSensorFallback,1, .150, opt_sensor_fallback ; =1: Fallback to SP1 when sensor is lost - OPTION_BOOL oFlipScreen, 0, .151, opt_flip_screen ; =1: Flip the screen - OPTION_UINT8p10 ocR_button_left, .20, .100, .40, tPercent, .152, opt_cR_button_left ; left button sensitivity - OPTION_UINT8p10 ocR_button_right,.20, .100, .40, tPercent, .153, opt_cR_button_right ; right button sensitivity - OPTION_UINT8 obottom_usage, .5,.50, .20,tLitersMinute, .154, char_I_bottom_usage ; l/min - OPTION_UINT8 odeco_usage, .5,.50, .20,tLitersMinute, .155, char_I_deco_usage ; l/min - OPTION_BOOL oMODwarning, 0, .156, opt_modwarning ; =1: red depth blinking warning - OPTION_BOOL oVSItextv2, 0, .157, opt_vsitextv2 ; =1: use the dynamic (depends on depth) ascend rate limits - OPTION_BOOL oVSIgraph, 0, .158, opt_vsigraph ; =1: draw the graphical VSI bar - OPTION_BOOL oShowppO2, 0, .159, opt_showppo2 ; =1:always show the ppO2 value in the warning position - OPTION_UINT8 oTemperatureAdjust, .0,.255, .0, -1, .160, opt_temperature_adjust ; SIGNED int (-2.0/+2.0 °C max.) - OPTION_UINT8 oSafetyStopLength, .60,.240, .180, -1, .161, opt_safety_stop_length ; [s] - OPTION_UINT8 oSafetyStopStart, .21,.61, .51, -1, .162, opt_safety_stop_start ; [cbar], default 510mbar, min 210mbar, max 610mbar - OPTION_UINT8 oSafetyStopEnd, .19,.39, .29, -1, .163, opt_safety_stop_end ; [cbar], default 290mbar, min 190mbar, max 390mbar - OPTION_UINT8 oSafetyStopReset, .81,.151, .101, -1, .164, opt_safety_stop_reset ; [cbar], default 1010mbar, min 810mbar, max 1510mbar + OPTION_ENUM8 oColorSetDive, 4, 0, tColorSetName0, .146, opt_dive_color_scheme ; Color scheme divemode + OPTION_UINT8 oPressureAdjust, .0,.255, .0, -1, .147, opt_pressure_adjust ; SIGNED int (-20/+20mbar max.) + OPTION_BOOL oSafetyStop, 0, .148, opt_enable_safetystop ; =1: A safety stop is shown + OPTION_UINT8 oCalGasO2, .21,.100, .21, tPercent, .149, opt_calibration_O2_ratio ; Calibration gas %O2 (Do not move in EEPROM, must stay at .149!) + OPTION_BOOL oFlipScreen, 0, .151, opt_flip_screen ; =1: Flip the screen + OPTION_UINT8p10 ocR_button_left, .20, .100, .40, tPercent, .152, opt_cR_button_left ; left button sensitivity + OPTION_UINT8p10 ocR_button_right,.20, .100, .40, tPercent, .153, opt_cR_button_right ; right button sensitivity + OPTION_UINT8 obottom_usage, .5,.50, .20,tLitersMinute, .154, char_I_bottom_usage ; l/min + OPTION_UINT8 odeco_usage, .5,.50, .20,tLitersMinute, .155, char_I_deco_usage ; l/min + OPTION_BOOL oMODwarning, 0, .156, opt_modwarning ; =1: red depth blinking warning + OPTION_BOOL oVSItextv2, 0, .157, opt_vsitextv2 ; =1: use the dynamic (depends on depth) ascend rate limits + OPTION_BOOL oVSIgraph, 0, .158, opt_vsigraph ; =1: draw the graphical VSI bar + OPTION_BOOL oShowppO2, 0, .159, opt_showppo2 ; =1:always show the ppO2 value in the warning position + OPTION_UINT8 oTemperatureAdjust, .0,.255, .0, -1, .160, opt_temperature_adjust ; SIGNED int (-2.0/+2.0 °C max.) + OPTION_UINT8 oSafetyStopLength, .60,.240, .180, -1, .161, opt_safety_stop_length ; [s] + OPTION_UINT8 oSafetyStopStart, .21,.61, .51, -1, .162, opt_safety_stop_start ; [cbar], default 510mbar, min 210mbar, max 610mbar + OPTION_UINT8 oSafetyStopEnd, .19,.39, .29, -1, .163, opt_safety_stop_end ; [cbar], default 290mbar, min 190mbar, max 390mbar + OPTION_UINT8 oSafetyStopReset, .81,.151, .101, -1, .164, opt_safety_stop_reset ; [cbar], default 1010mbar, min 810mbar, max 1510mbar OPTION_UINT8 oDiveTimeout, .1,.20, divemode_timeout_default, tMinutes, .168, opt_diveTimeout ; Timeout for divemode in minutes - OPTION_UINT8 oPSCR_drop, .0,.15, .4, tPercent,.169, opt_PSCR_drop ; PSCR Drop [%] - OPTION_UINT8 oPSCR_lungratio,.5,.20, .10, tPercent,.170, opt_PSCR_lungratio ; PSCR Lung Ratio [1/x] - OPTION_UINT8p10 oPPO2MaxDeco,.120, ppo2_warning_high_deco,.160,0,.171, opt_ppO2_max_deco ; ppO2 max for deco gases + OPTION_UINT8 oPSCR_drop, .0,.15, .4, tPercent,.169, char_I_PSCR_drop ; PSCR Drop [%] + OPTION_UINT8 oPSCR_lungratio,.5,.20, .10, tPercent,.170, char_I_PSCR_lungratio ; PSCR Lung Ratio [1/x] + OPTION_UINT8p10 oPPO2MaxDeco,.120, ppo2_warning_high_deco,.160,0,.171, char_I_ppO2_max_deco ; ppO2 max for deco gases + OPTION_UINT8p10 oPPO2MinCC, ppo2_warning_low_cc_min, ppo2_warning_low_cc_max, ppo2_warning_low_cc, 0, .172, char_I_ppO2_min_loop ; ppO2 min for Loop + OPTION_UINT8 oTankSize1, .1, .40, .11, tLiter, .173, char_I_tank_size+0 ; size of OC gas tank 1 + OPTION_UINT8 oTankSize2, .1, .40, .11, tLiter, .174, char_I_tank_size+1 ; size of OC gas tank 2 + OPTION_UINT8 oTankSize3, .1, .40, .11, tLiter, .175, char_I_tank_size+2 ; size of OC gas tank 3 + OPTION_UINT8 oTankSize4, .1, .40, .11, tLiter, .176, char_I_tank_size+3 ; size of OC gas tank 4 + OPTION_UINT8 oTankSize5, .1, .40, .11, tLiter, .177, char_I_tank_size+4 ; size of OC gas tank 5 + OPTION_UINT8 oTankFillPres1, .5, .29, .20, tbar10, .178, char_I_tank_pres_fill+0 ; fill press of OC gas tank 1 + OPTION_UINT8 oTankFillPres2, .5, .29, .20, tbar10, .179, char_I_tank_pres_fill+1 ; fill press of OC gas tank 2 + OPTION_UINT8 oTankFillPres3, .5, .29, .20, tbar10, .180, char_I_tank_pres_fill+2 ; fill press of OC gas tank 3 + OPTION_UINT8 oTankFillPres4, .5, .29, .20, tbar10, .181, char_I_tank_pres_fill+3 ; fill press of OC gas tank 4 + OPTION_UINT8 oTankFillPres5, .5, .29, .20, tbar10, .182, char_I_tank_pres_fill+4 ; fill press of OC gas tank 5 + OPTION_UINT8 oCCmaxFracO2, .80, .100, .90, tPercent,.183, char_I_cc_max_frac_o2 ; max. O2 % in Loop + OPTION_UINT8 oSimSetpoint, .1, .5, .1, tblank, .184, opt_sim_setpoint_number ; setpoint to use for deco calculation + OPTION_BOOL oCalcAscGas, 0, .185, opt_calc_asc_gasvolume ; calculate OC gas volume needs for ascent + OPTION_BOOL oSimAGF, 0, -1, opt_sim_use_aGF ; use GF (no) or aGF (yes) for deco calculation + OPTION_ENUM8 oAltMode, 4, 0, tAltModeFly, .186, char_I_altitude_wait ; 0=no-fly, 1=1000m, 2=2000m, 3=3000m + OPTION_BOOL oEnable_IBCD, 0, .187, opt_enable_IBCD ; =1: IBCD warning activated + OPTION_UINT8 oAscentSpeed, .5, .10, .10,tMeterMinute,.188, char_I_ascent_speed ; ascent speed - Attention: proper operation with other values than the default of 10m/min has not been validated yet! Do not deviate from the default until further notice! + OPTION_UINT8 oGasChangeTime,.0, .3, .1, tmin ,.198, char_I_gas_change_time ; (extra) time at a stop to change the gas + ;============================================================================= ; Set Time/Set Date (RAM only) OPTION_UINT8 oSetHours, .0, .23, .0, 0, -1, hours
--- a/src/options.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/options.asm Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File options.asm +; File options.asm REFACTORED VERSION V2.91 ; ; Manage all options data. ; @@ -376,30 +376,41 @@ ; OUTPUT: none ; TRASH: TBLPTR, TABLAT, WREG, FSR0, FSR1 option_inc: - ; Read type, default and register from table - rcall option_read + ; Read type, default and register from table + rcall option_read - ; Switch on type - movf opt_type,W - bz option_inc_uint8 - dcfsnz WREG - bra option_inc_enum8 - dcfsnz WREG - bra option_inc_string + ; Switch on type + movf opt_type,W + bz option_inc_uint8 + dcfsnz WREG + bra option_inc_enum8 + dcfsnz WREG + bra option_inc_string + option_inc_uint8: ; Defaults type too... - movf INDF1,W - addwf opt_inc,W - cpfslt opt_max - bra option_inc_1 - movf opt_min,W + movf INDF1,W + addwf opt_inc,W + cpfslt opt_max + bra option_inc_1 + movf opt_min,W option_inc_1: - movwf INDF1 - + movwf INDF1 + + ; NEW FROM HERE... ## voting logic (allow sensors for pSCR) + ; Now some rather crude hack into this routine to unify CCR & pSCR mode setting: + movlw .25 ; eeprom address of option oCCRMode + cpfseq opt_eeprom ; skip next line if we deal with this option right now + bra option_inc_2 + btfsc FLAG_pscr_mode ; skip next line if we are not in PSCR mode + bcf opt_ccr_mode,1 ; in pSCR mode, opt_ccr_mode may only be 0 or 1 + +option_inc_2: +; ...UNTILL HERE ; Now some rather crude hack into this routine to make CCR Calibration more convenient: movlw .149 ; eeprom address of option CalGasO2 cpfseq opt_eeprom ; skip next line if we deal with this option right now - return + return btfsc FLAG_pscr_mode ; skip next line if we are not in PSCR mode return
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/p2_deco-TESTING.c Wed Jan 31 19:39:37 2018 +0100 @@ -0,0 +1,3802 @@ +// ************************************************************** +// p2_deco.c REFACTORED VERSION V2.95 +// !! SPECIAL TESTING VERSION - DO NOT USE FOR REAL DIVES !! +// Created on: 12.05.2009 =========================================================== +// Author: chsw -> This version shows the alternative (bailout) stops <- +// -> instead of the stop from the normal dive plan. <- +// ************************************************************** + +////////////////////////////////////////////////////////////////////////////// +// OSTC - diving computer code +// Copyright (C) 2011 HeinrichsWeikamp GbR +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +// +////////////////////////////////////////////////////////////////////////////// + +// ***************************** +// ** I N T R O D U C T I O N ** +// ***************************** +// +// OSTC +// +// code: +// p2_deco.c +// part2 of the OSTC code +// +// summary: +// decompression routines +// for the OSTC experimental project +// written by Christian Weikamp +// contributions by Ralph Lembcke +// +// +// history: +// 01/03/08 v100: first release candidate +// 03/13/08 v101: start of programming ppO2 code +// 03/13/25 v101a: backup of interim version with ppO2 calculation +// 03/13/25 v101: open circuit gas change during deco +// 03/13/25 v101: CNS_fraction calculation +// 03/13/26 v101: optimization of tissue calc routines +// 07/xx/08 v102a: debug of bottom time routine +// 09/xx/08 v102d: Gradient Factor Model implementation +// 10/10/08 v104: renamed to build v103 for v118 stable +// 10/14/08 v104: integration of char_I_depth_last_deco for Gradient Model +// 03/31/09 v107: integration of FONT Incon24 +// 05/23/10 v109: 5 gas changes & 1 min timer +// 07/13/10 v110: cns vault added +// 12/25/10 v110: split in three files (deco.c, main.c, definitions.h) +// 2011/01/20: [jDG] Create a common file included in ASM and C code. +// 2011/01/24: [jDG] Make ascenttime an short. No more overflow! +// 2011/01/25: [jDG] Fusion deco array for both models. +// 2011/01/25: [jDG] Use CF(54) to reverse deco order. +// 2011/02/11: [jDG] Reworked gradient-factor implementation. +// 2011/02/15: [jDG] Fixed inconsistencies introduced by gas switch delays. +// 2011/03/21: [jDG] Added gas consumption (CF56 & CF57) evaluation for OCR mode. +// 2011/04/15: [jDG] Store low_depth in 32bits (w/o rounding), for a better stability. +// 2011/04/25: [jDG] Added 1mn mode for CNS calculation, to allow it for deco planning. +// 2011/04/27: [jDG] Fixed char_O_gradient_factor calculation when model uses gradient-factor. +// 2011/05/02: [jDG] Added "Future TTS" function (CF58). +// 2011/05/17: [jDG] Various cleanups. +// 2011/08/08: [jDG] Computes CNS during deco planning ascent. +// 2011/11/24: [jDG] Slightly faster and better NDL computation. +// 2011/12/17: [mH] Remove of the useless debug stuff +// 2012/02/24: [jDG] Remove missed stop bug. +// 2012/02/25: [jDG] Looking for a more stable LOW grad factor reference. +// 2012/09/10: [mH] Fill char_O_deco_time_for_log for logbook write +// 2012/10/05: [jDG] Better gas_volumes accuracy (average depth, switch between stop). +// 2013/03/05: [jDG] Should vault low_depth too. +// 2013/03/05: [jDG] Wrobell remark: ascent_to_first_stop works better with finer steps (2sec). +// 2013/05/08: [jDG] A. Salm remark: NOAA tables for CNS are in ATA, not bar. +// 2013/12/21: [jDG] Fix CNS calculation in deco plan w/o marked gas switch +// 2014/06/16: [jDG] Fix Helium diluent. Fix volumes with many travel mix. +// 2014/06/29: [mH] Compute int_O_ceiling +// 2015/06/12: [jDG] Fix NDL prediction while desaturating with the Buhlmann model. +// 2017/08/04: [mH] Switch to absolute GF everywhere and apply safety margin parameters to both models (GF and non-GF), fixes from Ralph Lembcke +// 2017/10/31: [rl] enhancements for pSCR mode and introduction of 2nd deco plan computation +// 2017/12/31: [rl] completion of 2nd deco plan computation and various up-fixes +// +// +// Literature: +// Buhlmann, Albert: Tauchmedizin; 4. Auflage [2002]; +// Schr"oder, Kai & Reith, Steffen; 2000; S"attigungsvorg"ange beim Tauchen, das Modell ZH-L16, Funktionsweise von Tauchcomputern; http://www.achim-und-kai.de/kai/tausim/saett_faq +// Morrison, Stuart; 2000; DIY DECOMPRESSION; http://www.lizardland.co.uk/DIYDeco.html +// Balthasar, Steffen; Dekompressionstheorie I: Neo Haldane Modelle; http://www.txfreak.de/dekompressionstheorie_1.pdf +// Baker, Erik C.; Clearing Up The Confusion About "Deep Stops" +// Baker, Erik C.; Understanding M-values; http://www.txfreak.de/understanding_m-values.pdf +// +// + +// ********************* +// ** I N C L U D E S ** +// ********************* +#include <math.h> + +// *********************************************** +// ** V A R I A B L E S D E F I N I T I O N S ** +// *********************************************** + +#include "p2_definitions.h" +#define TEST_MAIN +#include "shared_definitions.h" + + +// ambient pressure at different mountain heights +#define P_ambient_1000m 0.880 // [bar] based on 990 hPa and 20°C at sea level, 15°C at altitude +#define P_ambient_2000m 0.782 // [bar] +#define P_ambient_3000m 0.695 // [bar] + +// ambient pressure in aircraft cabin during flying - worst case according to Buhlmann +#define P_ambient_fly 0.600 // [bar], 0.600 bar is the value used by Buhlmann for his flying-after-diving calculations + // 0.735 bar is a typical cabin pressure for nowadays commercial jet aircrafts + // ----- + // 0.135 bar safety margin + +// constants and factors +#define ppWater 0.0627 // water vapor partial pressure in the lungs +#define METER_TO_BAR 0.09985 // conversion factor +#define BAR_TO_METER 10.0150 // conversion factor (1.0/METER_TO_BAR) +#define SURFACE_DESAT_FACTOR 0.7042 // surface desaturation safety factor +#define HYST 1.0E-06 // threshold for tissue graphics on-gassing / off-gassing visualization + +// thresholds +#define GF_warning_threshold 100 // threshold for GF warning +#define GF_prewarning_threshold 70 // threshold for GF attention +#define CNS_warning_threshold 100 // threshold for CNS warning +#define CNS_prewarning_threshold 70 // threshold for CNS attention +#define ppO2_prewarn_threshold 120 // threshold for ppO2 attention (master warnings come through options_table.asm) +#define GAS_NEEDS_ATTENTION_THRESHOLD 0.70 // threshold for gas needs attention + +// deco engine states and modes +#define DECO_STATUS_MASK 0x03 +#define DECO_STATUS_START 0x00 +#define DECO_STATUS_FINISHED 0x00 +#define DECO_STATUS_STOPS 0x01 +#define DECO_STATUS_ASCENT 0x02 +#define DECO_STATUS_INIT 0x03 + +#define DECO_MODE_MASK 0x0C +#define DECO_MODE_LOOP 0x04 +#define DECO_MODE_CCR 0x04 // to be used with == operator in combination with DECO_MODE_MASK only! +#define DECO_MODE_PSCR 0x08 + +#define DECO_PLAN_ALTERNATE 0x10 +#define DECO_CNS_CALCULATE 0x20 +#define DECO_VOLUME_CALCULATE 0x40 +#define DECO_ASCENT_DELAYED 0x80 + +// deco engine warnings +#define DECO_WARNING_IBCD 0x01 +#define DECO_WARNING_IBCD_lock 0x02 +#define DECO_WARNING_MBUBBLES 0x04 +#define DECO_WARNING_MBUBBLES_lock 0x08 +#define DECO_WARNING_OUTSIDE 0x10 +#define DECO_WARNING_OUTSIDE_lock 0x20 +#define DECO_WARNING_STOPTABLE_OVERFLOW 0x40 +#define DECO_FLAG 0x80 + +// flags used with integer numbers +#define INT_FLAG_INVALID 0x0400 +#define INT_FLAG_ZERO 0x0800 +#define INT_FLAG_LOW 0x1000 +#define INT_FLAG_HIGH 0x2000 +#define INT_FLAG_PREWARNING 0x4000 +#define INT_FLAG_WARNING 0x8000 + + + +// ************************* +// ** P R O T O T Y P E S ** +// ************************* + +static void calc_hauptroutine(void); +static void calc_hauptroutine_data_input(void); +static void calc_hauptroutine_update_tissues(void); +static void calc_hauptroutine_calc_deco(void); +static void calc_tissue(void); +static void calc_limit(void); +static void calc_nullzeit(void); +static void calc_ascenttime(void); +static void calc_dive_interval(void); +static void calc_gradient_factor(void); +static void calc_wo_deco_step_1_min(void); +static void calc_desaturation_time(void); + +static void sim_extra_time(void); +static void sim_ascent_to_first_stop(void); +static void sim_limit(PARAMETER float GF_current); + +static void update_startvalues(void); +static void gas_switch_set(void); +static void compute_CNS_for_display(void); + +static void clear_deco_table(void); +static void clear_tissue(void); + +static unsigned char gas_find_better(void); +static unsigned char calc_nextdecodepth(void); +static unsigned char update_deco_table(PARAMETER unsigned char time_increment); + + +//---- Bank 5 parameters ----------------------------------------------------- +#ifndef UNIX +# pragma udata bank5=0x500 +#endif + +// general deco parameters + +static float GF_low; // initialized from deco parameters, constant during all computations +static float GF_high; // initialized from deco parameters, constant during all computations +static float GF_delta; // initialized from deco parameters, constant during all computations +static float locked_GF_step_norm; // GF_delta / low_depth_norm in normal plan +static float locked_GF_step_alt; // GF_delta / low_depth_alt in alternative plan + +static float low_depth_norm; // Depth of deepest stop in normal plan +static float low_depth_alt; // Depth of deepest stop in alternative plan + +static float float_ascent_speed; // ascent speed from options_table (1.0 .. 10.0 m/min) +static float float_saturation_multiplier; // safety factor for on-gassing rates +static float float_desaturation_multiplier; // safety factor for off-gassing rates +static float float_deco_distance; // additional depth below stop depth for tissue, CNS and gas volume calculation + + +// real context: what we are doing now. + +static float calc_lead_tissue_limit; // minimum tolerated ambient pressure by Buhlmann model +static float CNS_fraction; // current CNS (1.00 = 100%) + +static unsigned short deco_tissue_vector; // 32 bit vector to memories all tissues that are in decompression +static unsigned short IBCD_tissue_vector; // 32 bit vector to memories all tissues that experience IBCD + +// simulation context: used to predict ascent. + +static float sim_lead_tissue_limit; // minimum tolerated ambient pressure by Buhlmann model +static float CNS_sim_norm_fraction; // CNS at end of dive in normal plan +static float CNS_sim_alt_fraction; // CNS at end of dive in alternative plan + +static unsigned char temp_depth_limit; // depth of next stop in meters, used in deco calculations +static unsigned char sim_lead_tissue_no; // Leading compartment number +static unsigned char split_N2_He[NUM_COMP]; // used for calculating the desaturation time + + +// stops table + +static unsigned char internal_deco_depth[NUM_STOPS]; // depth of the stop +static unsigned char internal_deco_time[NUM_STOPS]; // duration of the stop +static unsigned char internal_deco_gas[NUM_STOPS]; // gas used at the stop + + +// transfer variables between calc_desaturation_time() and calc_desaturation_time_helper() + +static float desat_factor; // used to cache a pre-computed factor +static float var_ht; // buffer for a half-time factor +static float pres_target; // target pressure for a compartment +static float pres_actual; // current pressure of the compartment +static unsigned short short_time; // time it takes for the compartment to reach the target pressure + +// transfer variables between gas_volumes() and gas_volumes_helper() +static float float_depth; // depth of the stop or half-way point +static float float_time; // duration of the stop or ascent phase +static float volume; // computed volume of gas +static unsigned char usage; // gas usage in l/min + + +// 44 byte free space left in this bank + + +//---- Bank 6 parameters ----------------------------------------------------- +#ifndef UNIX +# pragma udata bank6=0x600 +#endif + +// indexing and sequencing + +static unsigned char ci; // used as index to the Buhlmann tables +static unsigned char twosectimer = 0; // used for timing the tissue updating +static unsigned char tissue_increment; // Selector for real/simulated tissues and time increment + + +// environmental and gas data + +static float pres_respiration; // current depth in absolute pressure +static float pres_surface; // absolute pressure at the surface +static float temp_deco; // simulated current depth in abs.pressure, used for deco calculations + +static float O2_ratio; // real breathed gas oxygen ratio +static float N2_ratio; // real breathed gas nitrogen ratio +static float He_ratio; // real breathed gas helium ratio + +static float calc_O2_ratio; // simulated breathed gas oxygen ratio +static float calc_N2_ratio; // simulated breathed gas nitrogen ratio +static float calc_He_ratio; // simulated breathed gas helium ratio + +static float O2_ppO2; // ppO2 - calculated for pure oxygen at current depth +static float pSCR_ppO2; // ppO2 - calculated for breathed from pSCR loop +static float pure_ppO2; // ppO2 - calculated for breathed in OC mode + +static unsigned char char_actual_ppO2; // ppO2 - assumed to be breathed, as integer 100 = 1.00 bar + +static float breathed_ppO2; // partial pressure of breathed oxygen +static float ppN2; // partial pressure of breathed nitrogen +static float ppHe; // partial pressure of breathed helium + + +// Buhlmann model parameters + +static float var_N2_a; // Buhlmann a, for current N2 tissue +static float var_N2_b; // Buhlmann b, for current N2 tissue +static float var_He_a; // Buhlmann a, for current He tissue +static float var_He_b; // Buhlmann b, for current He tissue +static float var_N2_e; // exposition, for current N2 tissue +static float var_He_e; // exposition, for current He tissue +static float var_N2_ht; // half-time for current N2 tissue +static float var_He_ht; // half-time for current N2 tissue + + +// gas switch history + +static unsigned char sim_gas_first_used; // Number of first used gas, for bottom segment +static unsigned char sim_gas_last_used; // number of last used gas +static unsigned char sim_gas_last_depth; // change depth of last used gas + + +// vault to back-up & restore tissue data + +static float pres_tissue_N2_vault[NUM_COMP]; // stores the nitrogen tissue pressures +static float pres_tissue_He_vault[NUM_COMP]; // stores the helium tissue pressures +static float low_depth_norm_vault; // stores a parameter of the GF model for normal plan +static float low_depth_alt_vault; // stores a parameter of the GF model for alternative plan +static float cns_vault_float; // stores current CNS (float representation) + +static unsigned int cns_vault_int; // stores current CNS (integer representation) +static unsigned char deco_warnings_vault; // stores warnings status + + +// auxiliary variables for local data buffering + +static float N2_equilibrium; // used for N2 tissue graphics scaling +static float temp_tissue; // auxiliary variable to buffer tissue pressures + + +// 7 byte free space left in this bank + + +//---- Bank 7 parameters ----------------------------------------------------- +#ifndef UNIX +# pragma udata bank7=0x700 +#endif + +// Keep order and position of the variables in bank 7 as they are backed-up to & restored from EEPROM + +float pres_tissue_N2[NUM_COMP]; // 16 floats = 64 bytes +float pres_tissue_He[NUM_COMP]; // 16 floats = 64 bytes +float sim_pres_tissue_N2[NUM_COMP]; // 16 floats = 64 bytes +float sim_pres_tissue_He[NUM_COMP]; // 16 floats = 64 bytes + + +//---- Bank 8 parameters ----------------------------------------------------- +#ifndef UNIX +# pragma udata overlay bank8=0x800 + +static char md_pi_subst[256]; // Overlay C-code data stack here, too. + +# define C_STACK md_pi_subst +#endif + +// Back to bank6 for further tmp data +#ifndef UNIX +# pragma udata bank6 +#endif + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +///////////////////////////// THE LOOKUP TABLES ////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// End of PROM code is 17F00, So push tables on PROM top... +// +#ifndef UNIX +# pragma romdata Buhlmann_tables = 0x1DD00 // Needs to be in UPPER bank. +#endif + +rom const float Buhlmann_ab[4*16] = { +// Data ZH-L16C, from Bühlmann Tauchmedizin 2002, option 1a (4mn) +// a for N2 b for N2 a of He b for He + 1.2599, 0.5050, 1.7424, 0.4245, + 1.0000, 0.6514, 1.3830, 0.5747, + 0.8618, 0.7222, 1.1919, 0.6527, + 0.7562, 0.7825, 1.0458, 0.7223, + 0.6200, 0.8126, 0.9220, 0.7582, + 0.5043, 0.8434, 0.8205, 0.7957, + 0.4410, 0.8693, 0.7305, 0.8279, + 0.4000, 0.8910, 0.6502, 0.8553, + 0.3750, 0.9092, 0.5950, 0.8757, + 0.3500, 0.9222, 0.5545, 0.8903, + 0.3295, 0.9319, 0.5333, 0.8997, + 0.3065, 0.9403, 0.5189, 0.9073, + 0.2835, 0.9477, 0.5181, 0.9122, + 0.2610, 0.9544, 0.5176, 0.9171, + 0.2480, 0.9602, 0.5172, 0.9217, + 0.2327, 0.9653, 0.5119, 0.9267 +}; + +rom const float Buhlmann_ht[2*16] = { +// Compartment half-life, in minute +//--- N2 ---- He ---------------------- + 4.0, 1.51, + 8.0, 3.02, + 12.5, 4.72, + 18.5, 6.99, + 27.0, 10.21, + 38.3, 14.48, + 54.3, 20.53, + 77.0, 29.11, + 109.0, 41.20, + 146.0, 55.19, + 187.0, 70.69, + 239.0, 90.34, + 305.0, 115.29, + 390.0, 147.42, + 498.0, 188.24, + 635.0, 240.03 +}; + +rom const float e2secs[2*16] = { +// result of 1 - 2^(-1/(2sec*HT)) +//---- N2 ------------- He ------------ + 5.75958E-03, 1.51848E-02, + 2.88395E-03, 7.62144E-03, + 1.84669E-03, 4.88315E-03, + 1.24813E-03, 3.29997E-03, + 8.55371E-04, 2.26041E-03, + 6.03079E-04, 1.59437E-03, + 4.25414E-04, 1.12479E-03, + 3.00019E-04, 7.93395E-04, + 2.11949E-04, 5.60641E-04, + 1.58240E-04, 4.18555E-04, + 1.23548E-04, 3.26795E-04, + 9.66686E-05, 2.55722E-04, + 7.57509E-05, 2.00387E-04, + 5.92416E-05, 1.56716E-04, + 4.63943E-05, 1.22734E-04, + 3.63850E-05, 9.62538E-05 +//------------------------------------- +}; + +rom const float e1min[2*16] = { +// Integration constant for 1 minute, +// Ie. 1- 2^(-1/HT) +//----- N2 --------- e 1min He -------- + 1.59104E-01, 3.68109E-01, + 8.29960E-02, 2.05084E-01, + 5.39424E-02, 1.36579E-01, + 3.67742E-02, 9.44046E-02, + 2.53454E-02, 6.56359E-02, + 1.79351E-02, 4.67416E-02, + 1.26840E-02, 3.31991E-02, + 8.96152E-03, 2.35301E-02, + 6.33897E-03, 1.66832E-02, + 4.73633E-03, 1.24808E-02, + 3.69981E-03, 9.75753E-03, + 2.89600E-03, 7.64329E-03, + 2.27003E-03, 5.99417E-03, + 1.77572E-03, 4.69082E-03, + 1.39089E-03, 3.67548E-03, + 1.09097E-03, 2.88359E-03 +//------------------------------------- +}; + +rom const float e10min[2*16] = { +// The 10 min Value in float notation: +// result of 1 - 2^(-10/ht) +//---- N2 -------------- He ----------- + 8.23223E-01, 9.89851E-01, + 5.79552E-01, 8.99258E-01, + 4.25651E-01, 7.69737E-01, + 3.12487E-01, 6.29027E-01, + 2.26416E-01, 4.92821E-01, + 1.65547E-01, 3.80407E-01, + 1.19840E-01, 2.86538E-01, + 8.60863E-02, 2.11886E-01, + 6.16117E-02, 1.54849E-01, + 4.63665E-02, 1.18026E-01, + 3.63881E-02, 9.34005E-02, + 2.85855E-02, 7.38569E-02, + 2.24698E-02, 5.83504E-02, + 1.76160E-02, 4.59303E-02, + 1.38222E-02, 3.61528E-02, + 1.08563E-02, 2.84646E-02 +//------------------------------------- +}; + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////// THE SUBROUTINES /////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// all new in v.102 +// moved from 0x0D000 to 0x0C000 in v.108 +#ifndef UNIX +# pragma code p2_deco = 0x0C000 +#endif + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +/////////////////////// U T I L I T I E S ///////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////////////////// +// Bump to blue-screen when an assert is wrong +#ifdef __DEBUG +void assert_failed(PARAMETER short int line) +{ +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// When calling C code from ASM context, the data stack pointer and +// frames should be reset. Bank8 is used by stack + +#ifdef CROSS_COMPILE +# define RESET_C_STACK +#else +# ifdef __DEBUG +# define RESET_C_STACK fillDataStack(); + void fillDataStack(void) + { + _asm + LFSR 1,C_STACK + MOVLW 0xCC + loop: MOVWF POSTINC1,0 + TSTFSZ FSR1L,0 + BRA loop + + LFSR 1,C_STACK + LFSR 2,C_STACK + _endasm + } +# else +# define RESET_C_STACK \ + _asm \ + LFSR 1, C_STACK \ + LFSR 2, C_STACK \ + _endasm +# endif +#endif + +////////////////////////////////////////////////////////////////////////////// +// Fast subroutine to read timer 5. +// Note: result is in 1/32 of milliseconds (30,51757813 us/bit to be precise) +static unsigned short tmr5(void) +{ +#ifndef CROSS_COMPILE + _asm + movff 0xf7c,PRODL // TMR5L + movff 0xf7d,PRODH // TMR5H + _endasm // result in PRODH:PRODL. +#else + return 0; +#endif +} + +////////////////////////////////////////////////////////////////////////////// +// read Buhlmann tables A and B for compartment ci +// +static void read_Buhlmann_coefficients(void) +{ +#ifndef CROSS_COMPILE + // Note: we don't use far rom pointer, because the + // 24 bits is too complex, hence we have to set + // the UPPER page ourself... + // --> Set zero if tables are moved to lower pages ! + _asm + movlw 1 + movwf TBLPTRU,0 + _endasm +#endif + + assert( ci < NUM_COMP ); + + // Use an interleaved array (AoS) to access coefficients with a + // single addressing. + { + overlay rom const float* ptr = &Buhlmann_ab[4*ci]; + var_N2_a = *ptr++; + var_N2_b = *ptr++; + var_He_a = *ptr++; + var_He_b = *ptr++; + } +} + +////////////////////////////////////////////////////////////////////////////// +// read Buhlmann tables for compartment ci +// If period == 0 : 2sec interval +// 1 : 1 min interval +// 2 : 10 min interval. +static void read_Buhlmann_times(PARAMETER char period) +{ +#ifndef CROSS_COMPILE + // Note: we don't use far rom pointer, because the + // 24 bits is to complex, hence we have to set + // the UPPER page ourself... + // --> Set zero if tables are moved to lower pages ! + _asm + movlw 1 + movwf TBLPTRU,0 + _endasm +#endif + + assert( ci < NUM_COMP ); + + // Integration intervals. + switch(period) + { + case 0: //---- 2 sec ----------------------------------------------------- + { + overlay rom const float* ptr = &e2secs[2*ci]; + var_N2_e = *ptr++; + var_He_e = *ptr++; + } + break; + + case 1: //---- 1 min ----------------------------------------------------- + { + overlay rom const float* ptr = &e1min[2*ci]; + var_N2_e = *ptr++; + var_He_e = *ptr++; + } + break; + + case 2: //---- 10 min ---------------------------------------------------- + { + overlay rom const float* ptr = &e10min[2*ci]; + var_N2_e = *ptr++; + var_He_e = *ptr++; + } + break; + + default: + assert(0); // Never go there... + } +} + +////////////////////////////////////////////////////////////////////////////// +// read Buhlmann tables for compartment ci +// +static void read_Buhlmann_ht(void) +{ + +#ifndef CROSS_COMPILE + // Note: we don't use far rom pointer, because the + // 24 bits is to complex, hence we have to set + // the UPPER page ourself... + // --> Set zero if tables are moved to lower pages ! + _asm + movlw 1 + movwf TBLPTRU,0 + _endasm +#endif + + assert( ci < NUM_COMP ); + { + overlay rom const float* ptr = &Buhlmann_ht[2*ci]; + var_N2_ht = *ptr++; + var_He_ht = *ptr++; + } + + assert( 4.0 <= var_N2_ht && var_N2_ht <= 635.0 ); + assert( 1.5099 <= var_He_ht && var_He_ht <= 240.03 ); +} + +////////////////////////////////////////////////////////////////////////////// +// calc_nextdecodepth +// +// new in v.102 +// +// INPUT, changing during dive: +// temp_deco : current depth in absolute pressure +// +// INPUT, fixed during dive: +// pres_surface +// GF_delta +// GF_high +// GF_low +// char_I_depth_last_deco +// +// MODIFIED +// locked_GF_step_norm/_alt : used for GF model +// low_depth_norm/_alt : used for GF model +// +// OUTPUT +// temp_depth_limit : depth of next stop in meters (if RETURN == true ) +// depth we can ascent to without stop (if RETURN == false) +// +// RETURN TRUE if a stop is needed. +// +static unsigned char calc_nextdecodepth(void) +{ + overlay unsigned char need_stop; + + // compute current depth in meters + overlay float depth = (temp_deco - pres_surface) * BAR_TO_METER; + + // compute depth in meters after 1 minute of ascent at float_ascent_speed (5..10 m/min) + overlay float min_depth = (depth > float_ascent_speed) ? (depth - float_ascent_speed) : 0.0; + + + // allow for 200mbar of weather dependent surface pressure change + assert( depth >= -0.2 ); + + + //---- check if a stop is needed for deco reasons ---------------------------- + + // switch on deco model + if( char_I_deco_model != 0 ) + { + //---- ZH-L16 + GRADIENT FACTOR Model ------------------------------------ + + overlay float locked_GF_step; + overlay float low_depth; + overlay float pres_gradient; + + overlay unsigned char first_stop = 0; + + + // calculate minimum depth we can ascent to in absolute pressure + sim_limit( GF_low ); + + // ...and convert the depth into relative pressure + pres_gradient = sim_lead_tissue_limit - pres_surface; + + // check if we can surface directly + if( pres_gradient <= 0.0 ) + { + min_depth = 0.0; // set minimum depth to 0 meters = surface + goto no_deco_stop; // done. + } + + // convert minimum depth we can ascent to from relative pressure to depth in meters + pres_gradient *= BAR_TO_METER; + + // recall low_depth dependent on current plan + low_depth = (char_O_deco_status & DECO_PLAN_ALTERNATE) ? low_depth_alt : low_depth_norm; + + // Store the deepest point needing a deco stop as the LOW reference for GF. + // NOTE: following stops will be validated using this LOW-HIGH GF scale, + // so if we want to keep coherency, we should not validate this stop + // yet, but apply the search to it, as for all the following stops afterward. + if( pres_gradient > low_depth ) + { + // update GF parameters + low_depth = pres_gradient; + locked_GF_step = GF_delta / low_depth; + + // store updated GF parameters dependent on current plan + if( char_O_deco_status & DECO_PLAN_ALTERNATE ) + { + low_depth_alt = low_depth; + locked_GF_step_alt = locked_GF_step; + } + else + { + low_depth_norm = low_depth; + locked_GF_step_norm = locked_GF_step; + } + } + else + { + // recall locked_GF_step dependent on current plan + locked_GF_step = (char_O_deco_status & DECO_PLAN_ALTERNATE) ? locked_GF_step_alt : locked_GF_step_norm; + } + + // invalidate this stop if we can ascent for 1 minute without going above minimum required deco depth + if( pres_gradient < min_depth ) goto no_deco_stop; + + + // if program execution passes here, we need a deco stop + + // Round to multiple of 3 meters + first_stop = 3 * (unsigned char)(0.9995 + pres_gradient * 0.333333); + + // check a constraint + assert( first_stop < 128 ); + + // apply correction for the shallowest stop, use char_I_depth_last_deco (3..6 m) instead + if( first_stop == 3 ) first_stop = char_I_depth_last_deco; + + // We have a stop candidate. + // But maybe ascending to the next stop will diminish the constraint, + // because the GF might decrease more than the pressure gradient... + while(first_stop > 0) + { + // Next depth + overlay unsigned char next_stop; + + // invalidate this stop if we can ascent one more minute without going above minimum required deco depth + if( first_stop <= (unsigned char)min_depth ) goto no_deco_stop; + + // compute depth of next stop + if ( first_stop <= char_I_depth_last_deco ) next_stop = 0; + else if ( first_stop == 6 ) next_stop = char_I_depth_last_deco; + else next_stop = first_stop - 3; + + // compute total pressure at the new stop candidate + pres_gradient = next_stop * METER_TO_BAR + pres_surface; + + // compute limit for the new stop candidate + if( (low_depth == 0.0) || (next_stop > low_depth) ) sim_limit( GF_low ); + else sim_limit( GF_high - next_stop * locked_GF_step ); + + // check if ascent to the next stop candidate is possible + if( sim_lead_tissue_limit >= pres_gradient ) goto deco_stop_found; // no - ascent to next_stop forbidden + + // else, validate that stop and loop... + first_stop = next_stop; + } + +no_deco_stop: + need_stop = 0; // set flag for stop needed to 'no' + temp_depth_limit = (unsigned char)min_depth; // report depth we can ascent to without stop + goto done; + +deco_stop_found: + need_stop = 1; // set flag for stop needed to 'yes' + temp_depth_limit = (unsigned char)first_stop; // stop depth, in meters + +done: + ; + } + else + { + //---- ZH-L16 model ------------------------------------------------- + + overlay float pres_gradient; + + + // calculate minimum depth we can ascent to in absolute pressure + sim_limit(1.0); + + // ...and convert the depth into relative pressure + pres_gradient = sim_lead_tissue_limit - pres_surface; + + // check if we can surface directly + if (pres_gradient >= 0) + { + // no - set flag for stop needed to 'yes' + need_stop = 1; + + // convert stop depth in relative pressure to stop index + pres_gradient *= BAR_TO_METER / 3; + + // convert stop index to depth in meters, rounded to multiple of 3 meters + temp_depth_limit = 3 * (short) (pres_gradient + 0.99); + + // correct last stop to 4m/5m/6m + if( temp_depth_limit == 3 ) temp_depth_limit = char_I_depth_last_deco; + } + else + { + // yes - set flag for stop needed to 'no' + need_stop = 0; + + // set depth we can ascent to as 0 = surface + temp_depth_limit = 0; + } + } + + + // After the first deco stop, gas changes are only done at deco stops now! + + // check if a stop is found and there is a better gas to switch to + if( need_stop && gas_find_better() ) + { + // set the new calculation ratios for N2, He and O2 + gas_switch_set(); + + // prime the deco stop with the gas change time + update_deco_table(char_I_gas_change_time); + } + + return need_stop; +} + +////////////////////////////////////////////////////////////////////////////// +// copy_deco_table +// +// Buffer the stops, once computed, so we can continue to display them +// while computing the next set. +// +static void copy_deco_table(void) +{ + // Copy depth of the first (deepest) stop, because when reversing + // order, it will be hard to find... + char_O_first_deco_depth = internal_deco_depth[0]; + char_O_first_deco_time = internal_deco_time [0]; + + { + overlay unsigned char x, y; + + for(x=0; x<NUM_STOPS; x++) + { + char_O_deco_depth[x] = internal_deco_depth[x]; + char_O_deco_time [x] = internal_deco_time [x]; + char_O_deco_gas [x] = internal_deco_gas [x]; + } + + //Now fill the char_O_deco_time_for_log array + //---- First: search the first non-null depth + for(x=(NUM_STOPS-1); x != 0; --x) + if( internal_deco_depth[x] != 0 ) break; + + //---- Second: copy to output table (in reverse order) + for(y=0; y<NUM_STOPS; y++, --x) + { + char_O_deco_time_for_log[y] = internal_deco_time [x]; + + // Stop only once the last transfer is done. + if( x == 0 ) break; + } + + //---- Third: fill table end with null + for(y++; y<NUM_STOPS; y++) + { + char_O_deco_time_for_log[y] = 0; + } + } +} + +////////////////////////////////////////////////////////////////////////////// +// temp_tissue_safety +// +// outsourced in v.102 +// +// Apply safety factors for both ZH-L16 models. +// +static void temp_tissue_safety(void) +{ + assert( 0.0 < float_desaturation_multiplier && float_desaturation_multiplier <= 1.0 ); + assert( 1.0 <= float_saturation_multiplier && float_saturation_multiplier <= 2.0 ); + + if( temp_tissue < 0.0 ) temp_tissue *= float_desaturation_multiplier; + else temp_tissue *= float_saturation_multiplier; +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// ** THE JUMP-IN CODE ** +// ** for the asm code ** +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////////////////// +// Called every second during diving. +// updates tissues every second invocation. +// +// Every few seconds (or slower when TTS > 16): +// - updates deco table (char_O_deco_time/depth) with new values. +// - updates ascent time, +// - sets status to zero (so we can check there is new results). +// +void deco_calc_hauptroutine(void) +{ + RESET_C_STACK + calc_hauptroutine(); +} + +////////////////////////////////////////////////////////////////////////////// +// Reset decompression model: +// + Set all tissues to equilibrium with Air at ambient pressure. +// + Reset last stop to 0m +// + Reset all model output. +void deco_clear_tissue(void) +{ + RESET_C_STACK + clear_tissue(); +} + +////////////////////////////////////////////////////////////////////////////// + +void deco_calc_wo_deco_step_1_min(void) +{ + RESET_C_STACK + calc_wo_deco_step_1_min(); + } + +////////////////////////////////////////////////////////////////////////////// + +void deco_calc_desaturation_time(void) +{ + RESET_C_STACK + calc_desaturation_time(); +} + +////////////////////////////////////////////////////////////////////////////// + +void deco_calc_dive_interval(void) +{ + RESET_C_STACK + calc_dive_interval(); +} + +////////////////////////////////////////////////////////////////////////////// +// Find current gas in the list (if any) and get its change depth +// +// Input: char_I_current_gas : 1..6 +// +// Output: sim_gas_last_used : 1..6 or 0 if it is the gas set as FIRST +// sim_gas_last_depth : change depth in meters or 0 if it is the gas set as FIRST +// +static void gas_find_current(void) +{ + assert( 0 <= char_I_current_gas && char_I_current_gas <= NUM_GAS ); + + if( char_I_current_gas <= NUM_GAS ) // Gas1..Gas5 + { + sim_gas_last_used = sim_gas_first_used = char_I_current_gas; + + // If current gas is a deco gas get it's change depth. + // Set change depth to 0 if the current gas is the first gas or + // a travel/normal gas, i.e. if it can be breathed at "any" depth. + if( char_I_deco_gas_change[sim_gas_last_used-1] ) sim_gas_last_depth = char_I_deco_gas_change[sim_gas_last_used-1]; + else sim_gas_last_depth = 0; + } + else + { + sim_gas_last_used = sim_gas_first_used = 0; // Gas 6 (the manually set one) has number 0 here + sim_gas_last_depth = 0; // handle it as a travel/normal gas + } +} + + +////////////////////////////////////////////////////////////////////////////// +// Find the deco gas with the shallowest change depth beyond current depth +// +// INPUT temp_depth_limit : current depth in meters +// char_I_deco_gas_change[] : change depths of the deco gases +// sim_gas_last_depth : change depth of the currently used gas, 0 if on the gas set as FIRST +// +// OUTPUT sim_gas_last_depth : switch depth - only if return value is true +// sim_gas_last_used : index of the gas (1..5) - only if return value is true +// +// RETURNS TRUE if a better gas is available +// +static unsigned char gas_find_better(void) +{ + overlay unsigned char switch_depth = 255; + overlay unsigned char switch_gas = 0; + overlay unsigned char j; + + + // no automatic gas changes in CCR mode and - as of now - in pSCR mode + if( char_O_deco_status & DECO_MODE_LOOP ) return 0; + + // Loop over all deco gases to find the shallowest one below or at current depth. + for(j=0; j<NUM_GAS; ++j) + { + // Is this the gas we are already breathing? + // If yes, skip this gas. + if( j+1 == sim_gas_last_used ) continue; + + // Is the change depth of the gas shallower than the current depth? + // If yes, skip this gas as it is not to be used yet. + // Remark: this check will also skip all disabled gases and the gas set + // as 'first' because these have their change depth set to 0. + if( temp_depth_limit > char_I_deco_gas_change[j] ) continue; + + // Is the change depth of the gas deeper than the change depth of the + // gas we are currently one? + // If yes, skip this gas as it is not better than the current one. + // Remark: if there is more than one gas with the same change depth, + // the last one from the list will be taken. + if( sim_gas_last_depth && (char_I_deco_gas_change[j] > sim_gas_last_depth) ) continue; + + // Is the change depth of the gas shallower or equal to the change depth + // of the best gas found so far, or is it the first better gas found? + // If yes, we have a better gas + if( char_I_deco_gas_change[j] <= switch_depth ) + { + switch_gas = j+1; // remember this gas (1..5) + switch_depth = char_I_deco_gas_change[j]; // remember its change depth + } + } // continue looping through all gases to eventually find an even better gas + + // has a better gas been found? + if( switch_gas ) + { + // yes + sim_gas_last_used = switch_gas; // report the index of the better + sim_gas_last_depth = switch_depth; // report its change depth + + assert( sim_gas_last_depth < switch_depth ); + + return 1; // signal a better gas was found + } + else + { + return 0; // signal no better gas was found + } +} + +////////////////////////////////////////////////////////////////////////////// +// Set calc_N2/He/O2_ratios by sim_gas_last_used +// +// Input: sim_gas_last_used : index of gas to use +// N2_ratio, He_ratio : if gas 0 = the manually set gas is in use +// +// Output: calc_N2_ratio, calc_He_ratio, calc_O2ratio +// +static void gas_switch_set(void) +{ + assert( 0 <= sim_gas_last_used <= NUM_GAS ); + + if( sim_gas_last_used == 0 ) // Gas6 = manually set gas. + { + calc_O2_ratio = O2_ratio; + calc_He_ratio = He_ratio; + } + else + { + calc_O2_ratio = char_I_deco_O2_ratio[sim_gas_last_used-1] * 0.01; + calc_He_ratio = char_I_deco_He_ratio[sim_gas_last_used-1] * 0.01; + } + + calc_N2_ratio = 1.0 - calc_O2_ratio - calc_He_ratio; + + assert( 0.0 <= calc_N2_ratio && calc_N2_ratio <= 0.95 ); + assert( 0.0 <= calc_He_ratio && calc_He_ratio <= 1.00 ); + assert( (calc_N2_ratio + calc_He_ratio) <= 1.00 ); +} + +////////////////////////////////////////////////////////////////////////////// +// Compute ppN2 and ppHe +// +// Input: calc_N2_ratio, calc_He_ratio : simulated gas mix. +// temp_deco : simulated respiration pressure +// float_deco_distance : safety factor +// ppWater : water-vapor pressure inside respiratory tract +// +// Output: ppN2, ppHe. +// +static void sim_alveolar_presures(void) +{ + overlay float deco_diluent = temp_deco; + + // read ppO2 reported from sensors or by setpoint // TODO: can be deleted + // char_actual_ppO2 = char_I_const_ppO2; + + + // Take deco offset into account, but not at surface. + // Note: this should be done on ambient pressure, hence before + // computing the diluent partial pressure... + if( deco_diluent > pres_surface ) deco_diluent += float_deco_distance; + + if( char_O_deco_status & DECO_MODE_LOOP ) + { + //---- Loop mode : adjust ppN2 and ppHe for change in ppO2 due to setpoint (CCR) or drop (pSCR)------- + + // get current setpoint (CCR) or sensor value (CCR, for pSCR see text below) as default + overlay float const_ppO2 = char_I_const_ppO2 * 0.01; + + if( char_O_deco_status & DECO_MODE_PSCR ) + { + //---- PSCR mode : compute loop gas ---------------------------------------- + // + // As the ppO2 in the loop changes with water depth, we can not use the current + // sensor value as with CCR mode, but need to compute the ppO2 for the given depth. + // Then we continue with the CCR mode code which calculates the increases of ppN2 + // and ppH2 due to the reduction of the ppO2 in the loop. Essentially, diving a + // PSCR is like diving a CCR with a setpoint lower than the ambient pressure x the + // O2 fraction of the diluent would yield... + // + + // deco_diluent is 0.0 ... in bar + // calc_O2_ratio is 0.0 ... 1 as factor + // char_I_PSCR_drop is 0 ... 15 as % + // char_I_PSCR_lungratio is 5 ... 20 as % + // const_ppO2 is 0.0 ... in bar + + const_ppO2 = (deco_diluent * calc_O2_ratio) - (1 - calc_O2_ratio) * 0.01 * char_I_PSCR_drop * char_I_PSCR_lungratio; + + // capture failure condition + if( const_ppO2 < 0.0 ) const_ppO2 = 0.0; + } + else + { + + //---- CCR mode ------------------------------------------------------------ + + // Limit the setpoint to the maximum physically possible ppO2. This prevents for + // example calculating with a setpoint of 1.3 bar in only 2 meters of depth. + // Additionally, if limiting occurs, the ppO2 can be further reduced to account + // for residual inert gases by the user-adjustable setting char_I_cc_max_frac_o2. + + if( const_ppO2 > deco_diluent ) // no ppWater subtracted here to give some margin for + { // sensors delivering data a little bit over target + + const_ppO2 = 0.01 * char_I_cc_max_frac_o2 * (deco_diluent - ppWater); + } + } + + if ( const_ppO2 == 0.0 ) char_actual_ppO2 = 0; + else if ( const_ppO2 > 2.545 ) char_actual_ppO2 = 255; + else char_actual_ppO2 = (unsigned char)(const_ppO2*100 + 0.5); + + // Note: ppO2 and ratios are known outside the lungs, so there is no ppWater in the equations below: + deco_diluent -= const_ppO2; + deco_diluent /= calc_N2_ratio + calc_He_ratio; + + // capture all failure conditions, including div/0 in case diluent is pure O2 + if( (deco_diluent < 0.0) || (calc_O2_ratio > 99.5) ) + { + deco_diluent = 0.0; + + char_actual_ppO2 = (unsigned char)(temp_deco*100 + 0.5); // without float_deco_distance here as this situation + // is likely to occur only at 6 meters or shallower + } + } + else + { + //---- OC mode: char_actual_ppO2 will be needed for CNS calculation later -------------------------------- + + overlay float ppO2 = pres_respiration * calc_O2_ratio; + + if ( ppO2 > 2.545 ) char_actual_ppO2 = 255; + else char_actual_ppO2 = (unsigned char)(ppO2*100 + 0.5); + } + + + if( deco_diluent > ppWater ) + { + ppN2 = calc_N2_ratio * (deco_diluent - ppWater); + ppHe = calc_He_ratio * (deco_diluent - ppWater); + } + else + { + ppN2 = 0.0; + ppHe = 0.0; + } + + assert( 0.0 <= ppN2 && ppN2 < 14.0 ); + assert( 0.0 <= ppHe && ppHe < 14.0 ); +} + +////////////////////////////////////////////////////////////////////////////// +// clear_tissue +// +// optimized in v.101 (var_N2_a) +// +// preload tissues with standard pressure for the given ambient pressure. +// Note: fixed N2_ratio for standard air. +// +static void clear_tissue(void) +{ + pres_respiration = 0.001 * int_I_pres_respiration; + N2_equilibrium = 0.7902 * (pres_respiration - ppWater); + + for(ci=0; ci<NUM_COMP; ci++) + { + // cycle through the 16 Buhlmann N2 tissues + pres_tissue_N2[ci] = N2_equilibrium; // initialize data for "real" tissue + char_O_tissue_N2_saturation[ci] = 11; // initialize data for tissue graphics + + + // cycle through the 16 Buhlmann He tissues + pres_tissue_He[ci] = 0.0; // initialize data for "real" tissue + char_O_tissue_He_saturation[ci] = 0; // initialize data for tissue graphics + } + + clear_CNS_fraction(); + + clear_deco_table(); + + char_O_main_status = 0; + char_O_deco_status = 0; + char_O_nullzeit = 0; + char_O_gtissue_no = 0; + char_O_deco_warnings = 0; + + int_O_ascenttime = 0; + int_O_gradient_factor = 0; + + calc_lead_tissue_limit = 0.0; +} + +////////////////////////////////////////////////////////////////////////////// +// calc_hauptroutine +// +// this is the major code in dive mode calculates: +// the tissues, +// the bottom time, +// and simulates the ascend with all deco stops. +// +// +static void calc_hauptroutine(void) +{ + unsigned int int_ppO2_min; + unsigned int int_ppO2_max; + + + //--- set-up part -------------------------------------------------------------------------------- + + // twosectimer: + // calc_hauptroutine is now invoked every second to speed up the deco planning. + // Because the tissue and CNS calculations are based on a 2 seconds period, the + // the following toggle-timer will be used by the respective routines to skip + // every 2nd invocation. + twosectimer = (twosectimer) ? 0 : 1; // toggle the toggle-timer + + + // set up normal tissue updating or "fast forward" updating for simulator sim+5' function + // and deco calculator bottom time calculation + if( char_I_sim_advance_time > 0 ) + { + // configure char_I_sim_advance_time minutes of tissue updating + tissue_increment = char_I_sim_advance_time // given number of minutes, limited to 127 + | 128; // set flag for updating the "real" tissues & CNS + + char_I_sim_advance_time = 0; // clear "mailbox" + } + else + { + // configure 2 seconds of tissue updating + tissue_increment = 0 // encoding for 2 seconds update + | 128; // set flag for updating the "real" tissues & CNS + } + + //---- calculate the real tissue's data ----------------------------------------------------------------- + + calc_hauptroutine_data_input(); // acquire current environment data + + calc_hauptroutine_update_tissues(); // update tissue pressures, also sets char_actual_ppO2 + + calc_CNS_fraction(); // calculate CNS% for the real tissues + + compute_CNS_for_display(); // compute integer copy of CNS value for display purpose + + calc_gradient_factor(); // compute current GF + + + //---- compute ppO2 warnings ------------------------------------------------------------------------------ + + // compute conditional min/max values + int_ppO2_min = (char_O_main_status & DECO_MODE_LOOP) ? (unsigned int)char_I_ppO2_min_loop : (unsigned int)char_I_ppO2_min; + int_ppO2_max = (char_O_deco_warnings & DECO_FLAG ) ? (unsigned int)char_I_ppO2_max_deco : (unsigned int)char_I_ppO2_max; + + // check for safe range of pure oxygen + if ( int_O_O2_ppO2 >= int_ppO2_max ) int_O_O2_ppO2 |= INT_FLAG_WARNING + INT_FLAG_HIGH; + + // check for safe range of breathed gas + if ( int_O_breathed_ppO2 <= int_ppO2_min ) int_O_breathed_ppO2 |= INT_FLAG_WARNING + INT_FLAG_LOW; + else if ( int_O_breathed_ppO2 >= int_ppO2_max ) int_O_breathed_ppO2 |= INT_FLAG_WARNING + INT_FLAG_HIGH; + else if ( int_O_breathed_ppO2 >= ppO2_prewarn_threshold ) int_O_breathed_ppO2 |= INT_FLAG_PREWARNING; + + // check for safe range of pure diluent + if ( int_O_pure_ppO2 <= (unsigned int)char_I_ppO2_min ) int_O_pure_ppO2 |= INT_FLAG_WARNING + INT_FLAG_LOW; + else if ( int_O_pure_ppO2 >= int_ppO2_max ) int_O_pure_ppO2 |= INT_FLAG_WARNING + INT_FLAG_HIGH; + + // check for safe range of calculated pSCR loop gas + if ( int_O_pSCR_ppO2 <= int_ppO2_min ) int_O_pSCR_ppO2 |= INT_FLAG_WARNING + INT_FLAG_LOW; + else if ( int_O_pSCR_ppO2 >= int_ppO2_max ) int_O_pSCR_ppO2 |= INT_FLAG_WARNING + INT_FLAG_HIGH; + + + //---- toggle between calculation for NDL (bottom time), deco stops and more deco stops (continue) ------ + + switch( char_O_deco_status & DECO_STATUS_MASK ) + { + overlay unsigned char i; + + case DECO_STATUS_INIT: //---- At surface: start a new dive --------------------- + + clear_deco_table(); + copy_deco_table(); + + char_I_ascent_speed = 10; // DEBUG - remove before flight! + char_I_gas_change_time = 1; // DEBUG - remove before flight! + + float_ascent_speed = 1.00 * char_I_ascent_speed; + float_desaturation_multiplier = 0.01 * char_I_desaturation_multiplier; + float_saturation_multiplier = 0.01 * char_I_saturation_multiplier; + float_deco_distance = 0.01 * char_I_deco_distance; + + int_O_ascenttime = 0; // Reset ascent time in normal plan + int_O_alternate_ascenttime = 0; // Reset ascent time in alternative plan + char_O_nullzeit = 0; // Reset no decompression limit (NDL) in normal plan + char_O_alternate_nullzeit = 0; // Reset no decompression limit (NDL) in alternative plan + char_O_deco_warnings = 0; // Reset all deco warning flags + deco_tissue_vector = 0; // Reset tissue deco vector + IBCD_tissue_vector = 0; // Reset tissue IBCD vector + + int_O_desaturation_time = 65535; // tag desaturation time as invalid (it will not be computed during a dive) + + + for(i=0; i<NUM_GAS; ++i) + { + int_O_gas_volumes[i] = 0; + int_O_tank_pres_need[i] = 0 + INT_FLAG_ZERO; // 0 bar + flag for 0 bar + } + + for(i=0; i<NUM_COMP; ++i) + { + split_N2_He[i] = 90; // used for calculation of no-fly time + } + + + // init CNS counters + CNS_sim_norm_fraction = CNS_sim_alt_fraction = CNS_fraction; // the floats + int_O_normal_CNS_fraction = int_O_alternate_CNS_fraction = int_O_CNS_fraction; // the integers + + + // Values that should be reset just once for the full real dive. + // This is used to record the lowest stop for the whole dive, + // including ACCROSS all simulated ascents. + low_depth_norm = low_depth_alt = 0.0; + locked_GF_step_norm = locked_GF_step_alt = 0.0; + + + // continue in state DECO_STATUS_START to calculate the bottom-part of the dive and the NDL + char_O_deco_status &= ~DECO_STATUS_MASK; + + // code execution continues in state DECO_STATUS_START + + + case DECO_STATUS_START: //---- bottom time ------------------------------------- + default: + + // reread the GF settings in case there was a switch between GF/aGF + GF_low = char_I_GF_Low_percentage * 0.01; + GF_high = char_I_GF_High_percentage * 0.01; + GF_delta = GF_high - GF_low; + + // Lookup current gas and store it also as the first gas used. This gas will be used for the bottom + // segment of the dive and for the period of delayed ascent when calculating fTTS or bailout. + gas_find_current(); + + // setup the calculation ratio's for N2, He and O2 + gas_switch_set(); + + // clear the internal(!) stops table + clear_deco_table(); + + // initialize the simulated tissues with the current state of the real tissues + update_startvalues(); + + // calculate the effect of extended bottom time due to delayed ascent / fTTS on current gas + if( char_O_deco_status & DECO_ASCENT_DELAYED ) sim_extra_time(); + + // calculate if we are within no decompression limit (NDL) + calc_nullzeit(); + + // check which plan we are on + if( char_O_deco_status & DECO_PLAN_ALTERNATE ) + { + // alternate dive plan + if( char_O_alternate_nullzeit > 0 ) // Some NDL time left in alternate plan? + { + copy_deco_table(); // DEBUG to be removed again + + // clear tank pressure needs + if( char_O_deco_status & DECO_VOLUME_CALCULATE ) + for(i=0; i<NUM_GAS; ++i) int_O_tank_pres_need[i] = 0 + INT_FLAG_ZERO; // 0 bar + flag for 0 bar + + // calculate the CNS% at the end of the dive if requested: + // as we are in no stop, CNS at end of dive is more or less the same CNS we have now + if( char_O_deco_status & DECO_CNS_CALCULATE ) int_O_alternate_CNS_fraction = int_O_CNS_fraction; + + // clear fTTS ascent time + int_O_alternate_ascenttime = 0; + + char_O_deco_status &= ~DECO_STATUS_MASK; // YES: computation of alternate plan completed + } + else + { + char_O_deco_status &= ~DECO_STATUS_MASK; // NO: clear status bits and set status bits + char_O_deco_status |= DECO_STATUS_ASCENT; // for calculation of ascent on next invocation + } + } + else + { + // normal dive plan + if( char_O_nullzeit > 0 ) // Some NDL time left in normal plan? + { + //copy_deco_table(); DEBUG original - comment in again // copy (erased) internal to external stops table + + // commented out - char_O_deco_last_stop not used for anything + // char_O_deco_last_stop = 0; // set last stop to 0 (for OSTC menu animation) + + // clear tank pressure needs + if( char_O_deco_status & DECO_VOLUME_CALCULATE ) + for(i=0; i<NUM_GAS; ++i) int_O_tank_pres_need[i] = 0 + INT_FLAG_ZERO; // 0 bar + flag for 0 bar + + // calculate the CNS% at the end of the dive if requested: + // as we are in no stop, CNS at end of dive is more or less the same CNS we have now + if( char_O_deco_status & DECO_CNS_CALCULATE ) int_O_normal_CNS_fraction = int_O_CNS_fraction; + + char_O_deco_status &= ~DECO_STATUS_MASK; // computation of normal plan completed + } + else + { + char_O_deco_status &= ~DECO_STATUS_MASK; // clear status bits and set status bits + char_O_deco_status |= DECO_STATUS_ASCENT; // for calculation of ascent on next invocation + } + } + + break; + + + case DECO_STATUS_ASCENT: //---- Simulate ascent to first stop ------------------- + + // initialize depth (in abs.pressure) for ascent and deco simulation, start from current real depth + temp_deco = pres_respiration; + + // calculate ascent to first stop + sim_ascent_to_first_stop(); + + // calculate all further stops next time + char_O_deco_status &= ~DECO_STATUS_MASK; // clear status bits and set status bits + char_O_deco_status |= DECO_STATUS_STOPS; // for calculation of stops on next invocation + + break; + + + case DECO_STATUS_STOPS: //---- Simulate stops ---------------------------------- + + calc_hauptroutine_calc_deco(); + + // If simulation is finished, do some more computations if requested + // and restore the GF low reference so that the next ascent simulation + // is done from the current depth: + if( !(char_O_deco_status & DECO_STATUS_MASK) ) + { + // Calculate ascent time, result in int_O_ascenttime or int_O_alternate_ascenttime + calc_ascenttime(); + + // the current depth is needed by calc_CNS_planning() and gas_volumes() + char_I_bottom_depth = (unsigned char)((pres_respiration - pres_surface)*BAR_TO_METER); + + // if requested, calculate the CNS% at the end of the dive (including the deco stops) + if( char_O_deco_status & DECO_CNS_CALCULATE ) calc_CNS_planning(); + + // if requested, calculate the required gas volumes and tank pressures at the end of the dive. + if( char_O_deco_status & DECO_VOLUME_CALCULATE ) gas_volumes(); + + // some more aftermath dependent on the current plan + if( char_O_deco_status & DECO_PLAN_ALTERNATE ) + { + //---- alternative plan ---------------------------------------------------- + +copy_deco_table(); // DEBUG to be removed again + + // was CNS at end of dive calculated? + if( char_O_deco_status & DECO_CNS_CALCULATE ) + { + // yes - compute CNS value to display + if ( CNS_sim_alt_fraction < 0.01 ) int_O_alternate_CNS_fraction = 0; + else if ( CNS_sim_alt_fraction > 9.985 ) int_O_alternate_CNS_fraction = 999 + INT_FLAG_WARNING; + else + { + // convert float to integer + int_O_alternate_CNS_fraction = (unsigned short)(100 * CNS_sim_alt_fraction + 0.5); + + // set warning flag if CNS is >= 100% + if( int_O_alternate_CNS_fraction >= 100 ) + int_O_alternate_CNS_fraction |= INT_FLAG_WARNING; + + // set invalid flag if there is an overflow in the stops table + if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW ) + int_O_alternate_CNS_fraction |= INT_FLAG_INVALID; + } + } + else + { + // no - invalidate value (value = 0, invalid flag set) + int_O_alternate_CNS_fraction = INT_FLAG_INVALID; + } + } + else + { + //---- normal plan --------------------------------------------------------- + + // publish the stops table +// copy_deco_table(); // DEBUG original + + // was CNS at end of dive calculated? + if( char_O_deco_status & DECO_CNS_CALCULATE ) + { + // yes - compute CNS value to display + if ( CNS_sim_norm_fraction < 0.01 ) int_O_normal_CNS_fraction = 0; + else if ( CNS_sim_norm_fraction >= 9.985 ) int_O_normal_CNS_fraction = 999 + INT_FLAG_WARNING; + else + { + // convert float to integer + int_O_normal_CNS_fraction = (unsigned short)(100 * CNS_sim_norm_fraction + 0.5); + + // set warning flag if CNS is >= 100% + if( int_O_normal_CNS_fraction >= 100 ) + int_O_normal_CNS_fraction |= INT_FLAG_WARNING; + + // set invalid flag if there is an overflow in the stops table + if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW ) + int_O_normal_CNS_fraction |= INT_FLAG_INVALID; + } + } + else + { + // no - invalidate value (value = 0, invalid flag set) + int_O_normal_CNS_fraction = INT_FLAG_INVALID; + } + + } // aftermath + } // if + + break; + + } // switch +} + +////////////////////////////////////////////////////////////////////////////// +// calc_hauptroutine_data_input +// +// Reset all C-code dive parameters from their ASM-code values. +// Detect gas change condition. +// +void calc_hauptroutine_data_input(void) +{ + // get the current pressures + pres_respiration = 0.001 * int_I_pres_respiration; + pres_surface = 0.001 * int_I_pres_surface; + + // get the currently breathed gas mixture + O2_ratio = 0.01 * char_I_O2_ratio; + He_ratio = 0.01 * char_I_He_ratio; + + // N2 ratios are computed within p2_deco.c from the O2 and He ratios + N2_ratio = 1.0 - O2_ratio - He_ratio; + + // N2 tissue pressure at surface equilibrium, used for tissue graphics scaling + N2_equilibrium = 0.7902 * (pres_surface - ppWater); +} + +////////////////////////////////////////////////////////////////////////////// +// +// +void calc_hauptroutine_update_tissues(void) +{ + overlay float pres_diluent = pres_respiration; + + + assert( 0.00 <= N2_ratio && N2_ratio <= 1.00 ); + assert( 0.00 <= He_ratio && He_ratio <= 1.00 ); + assert( (N2_ratio + He_ratio) <= 1.00 ); + assert( 0.800 < pres_respiration && pres_respiration < 14.0 ); + + + //---- OC, CCR and Bailout Mode Gas Calculations ------------------------------------------------------------ + + // calculate ppO2 of pure oxygen + O2_ppO2 = (pres_respiration - ppWater); + + // capture failure condition in case pres_respiration is < ppWater (should never happen...) + if( O2_ppO2 < 0.0 ) O2_ppO2 = 0.0; + + // calculate ppO2 of the pure gas (diluent) + pure_ppO2 = O2_ppO2 * O2_ratio; + + + //---- PSCR Mode Gas Calculation----------------------------------------------------------- + + // With flags set for PSCR we compute the ppO2 in the loop from the diluent's O2 + // ratio and the PSCR parameters. This figure will be used in the pSCR custom view. + // If sensors are used (char_I_const_ppO2 > 0), we will override the calculated ppO2 + // with the sensor data. Then we continue with the CCR mode code which calculates + // the increase of ppN2 and ppH2 due to the reduction of the ppO2 in the loop. + // Essentially, diving a pSCR is like diving a CCR with a setpoint set lower than + // the ambient pressure multiplied with the O2 fraction of the diluent... + + // calculate pSCR ppO2 + // + // pres_respiration is 0.0 ... in bar + // O2_ratio is 0.0 ... 1.0 as factor + // char_I_PSCR_drop is 0 ... 15 as % + // char_I_PSCR_lungratio is 5 ... 20 as % + // pSCRppO2 is 0.0 ... in bar + + pSCR_ppO2 = (pres_respiration * O2_ratio) - (1 - O2_ratio) * 0.01 * char_I_PSCR_drop * char_I_PSCR_lungratio; + + // capture failure condition if case pSCR_ppO2 becomes negative + if( pSCR_ppO2 < 0.0 ) pSCR_ppO2 = 0.0; + + + //---- Loop modes : adjust ppN2 and ppHe for change in ppO2 due to setpoint (CCR) or drop (pSCR) ------------ + if ( char_O_main_status & DECO_MODE_LOOP ) + { + overlay float const_ppO2; + + // get the current sensor reading (CCR / pSCR if fitted) or the fixed setpoint (CCR) / a zero (pSCR) + const_ppO2 = 0.01 * char_I_const_ppO2; + + // Limit the setpoint to the maximum physically possible ppO2. This prevents for + // example calculating with a setpoint of 1.3 bar in only 2 meters of depth. + // Additionally, if limiting occurs, the ppO2 can be further reduced to account + // for residual inert gases by the user-adjustable setting char_I_cc_max_frac_o2. + + if( const_ppO2 > pres_respiration ) // no ppWater subtracted here to give some margin for + { // sensors delivering data a little bit over target + + const_ppO2 = 0.01 * char_I_cc_max_frac_o2 * (pres_respiration - ppWater); + } + + // check which kind of loop we are on + if( char_O_main_status & DECO_MODE_PSCR ) + { + //---- pSCR Mode -------------------------------------------------------------------------- + + // check if a sensor is fitted + if( char_I_const_ppO2 ) breathed_ppO2 = const_ppO2; // yes - derive ppO2s from (char_I_)const_ppO2 + else breathed_ppO2 = pSCR_ppO2; // no - derive ppO2s from calculated ppO2 + } + else + { + //---- CCR Mode --------------------------------------------------------------------------- + + // derive breathed ppO2 from (char_I_)const_ppO2, which holds sensor reading or fixed setpoint + breathed_ppO2 = const_ppO2; + } + + // adjust diluent pressure (ppN2 + ppHe) for change in ppO2 due to setpoint (CCR) or drop (pSCR) + pres_diluent -= const_ppO2; + pres_diluent /= N2_ratio + He_ratio; + + // capture all failure conditions, including div/0 in case diluent is pure O2 + if( (pres_diluent < 0.0) || (char_I_O2_ratio == 100) ) + { + pres_diluent = 0.0; + breathed_ppO2 = pure_ppO2; + } + + } + else + { //---- OC mode ----------------------------------------------------------------------------------------- + + // breathed ppO2 is ppO2 of pure gas + breathed_ppO2 = pure_ppO2; + } + + + // derive char_actual_ppO2 in [cbar], used for calculating CNS% + if ( breathed_ppO2 < 0.01 ) char_actual_ppO2 = 0; + else if ( breathed_ppO2 >= 2.545 ) char_actual_ppO2 = 255; + else char_actual_ppO2 = (unsigned char)(100 * breathed_ppO2 + 0.5); + + + //---- export ppO2 values in [cbar] for warning generation and display purpose ------------------------------ + + // pure oxygen ppO2 + if ( O2_ppO2 < 0.01 ) int_O_O2_ppO2 = 0; + else if ( O2_ppO2 >= 9.995 ) int_O_O2_ppO2 = 999; + else int_O_O2_ppO2 = (unsigned int)(100 * O2_ppO2 + 0.5); + + // pure gas ppO2 + if ( pure_ppO2 < 0.01 ) int_O_pure_ppO2 = 0; + else if ( pure_ppO2 >= 9.995 ) int_O_pure_ppO2 = 999; + else int_O_pure_ppO2 = (unsigned int)(100 * pure_ppO2 + 0.5); + + // calculated pSCR ppO2 + if ( pSCR_ppO2 < 0.01 ) int_O_pSCR_ppO2 = 0; + else if ( pSCR_ppO2 >= 9.995 ) int_O_pSCR_ppO2 = 999; + else int_O_pSCR_ppO2 = (unsigned int)(100 * pSCR_ppO2 + 0.5); + + // breathed ppO2 + if ( breathed_ppO2 < 0.01 ) int_O_breathed_ppO2 = 0; + else if ( breathed_ppO2 >= 9.995 ) int_O_breathed_ppO2 = 999; + else int_O_breathed_ppO2 = (unsigned int)(100 * breathed_ppO2 + 0.5); + + + //---- calculate ppN2, ppHe and EAD, END ------------------------------------------------------------------- + + if( pres_diluent > ppWater ) + { + overlay float EAD, END; + + ppN2 = N2_ratio * (pres_diluent - ppWater); + ppHe = He_ratio * (pres_diluent - ppWater); + + // EAD : Equivalent Air Depth. Equivalent depth for the same N2 level with plain air. + // ppN2 = 79% * (P_EAD - ppWater) + // EAD = (P_EAD - Psurface) * 10 + // ie: EAD = (ppN2 / 0.7902 + ppWater -Psurface) * 10 + + EAD = (ppN2 / 0.7902 + ppWater - pres_surface) * BAR_TO_METER; + + if( (EAD < 0.0) || (EAD > 245.5) ) EAD = 0.0; + + char_O_EAD = (unsigned char)(EAD + 0.5); + + + // END : Equivalent Narcotic Depth. + // Here we count O2 as narcotic too. Hence everything but helium (has a narcosis + // factor of 0.23 btw). Hence the formula becomes: + // END * BarPerMeter * (1.0 - 0.0) - ppWater + Psurface == Pambient - ppHe - ppWater + // ie: END = (Pambient - ppHe - Psurface) * BAR_TO_METER + // + // Source cited: + // The Physiology and Medicine of Diving by Peter Bennett and David Elliott, + // 4th edition, 1993, W.B.Saunders Company Ltd, London. + + END = (pres_respiration - ppHe - pres_surface) * BAR_TO_METER; + + if( (END < 0.0) || (END > 245.5) ) END = 0.0; + + char_O_END = (unsigned char)(END + 0.5); + } + else + { + ppN2 = ppHe = 0.0; + + char_O_EAD = char_O_END = 0; + } + + + //---- calculate decompression status ---------------------------------------------------------------------- + + // Calculate tissues + calc_tissue(); + + // Calculate limit for surface, ie. GF_high. + calc_limit(); + + + // Fill int_O_ceiling (in mbar) if ceiling is below the surface + if( (calc_lead_tissue_limit - pres_surface) > 0 ) + { + +// compatibility version + int_O_ceiling = (short)((calc_lead_tissue_limit - pres_surface) * 1000); + +// new version +// // Round up to next 10 cm so that the ceiling disappears on the display only when the ceiling +// // limit is really zero. This will coincident then with TTS switching back to NDL time. +// int_O_ceiling = (short)((calc_lead_tissue_limit-pres_surface)*1000+9); + + + // limit int_O_ceiling to 16000 mbar (150 m) + if( int_O_ceiling > 16000) int_O_ceiling = 16000; + } + else + { + int_O_ceiling = 0; + } + + int_O_gtissue_press = (short)((pres_tissue_N2[char_O_gtissue_no] + pres_tissue_He[char_O_gtissue_no]) * 1000); +} + + +////////////////////////////////////////////////////////////////////////////// +// Compute stops. +// +// Note: because this can be very long, break on 16 iterations, and set state +// to DECO_STATUS_FINISHED when finished, or to DECO_STATUS_STOPS when +// needing to continue. +// Note: because each iteration might be very long too (~ 66 ms in 1.84beta), +// break the loop when elapsed time exceeds 512 milliseconds. +// +void calc_hauptroutine_calc_deco(void) +{ + overlay unsigned char loop; + + for(loop = 0; loop < 16; ++loop) + { + // limit loops to 512ms, using timer 5 + if( tmr5() & (512*32) ) break; + + // calc_nextdecodepth() + // + // INPUT temp_deco : current depth in absolute pressure + // OUTPUT temp_depth_limit : depth of next stop in meters + // RETURN true if a stop is needed + // + // The function manages gas changes by itself, including priming + // the deco stop with the configured gas change time. + // + if( calc_nextdecodepth() ) + { + if( temp_depth_limit == 0 ) goto Surface; // this check should not bee needed as in + // this case the RETURN value will be false + + //---- stop required at temp_depth_limit ------------------------------------- + + // convert stop depth in meters to absolute pressure + temp_deco = temp_depth_limit * METER_TO_BAR + pres_surface; + + // add one minute to the current stop, or add a new stop, + // or abort deco calculation if the deco table is full. + if( !update_deco_table(1) ) goto Surface; + } + else + { + //---- no stop required -------------------------------------- + + // ascend by float_ascent_speed for 1 minute + temp_deco -= float_ascent_speed * METER_TO_BAR; + + // finish deco calculation if surface is reached + if( temp_deco <= pres_surface ) + { +Surface: + // set deco engine status to done (DECO_STATUS_FINISHED) + char_O_deco_status &= ~DECO_STATUS_MASK; + + // commented out - char_O_deco_last_stop not used for anything + // surface reached (to animate menu) + // if( !(char_O_deco_status & DECO_PLAN_ALTERNATE)) char_O_deco_last_stop = 0; + + return; + } + } + + + //---- as one minute as passed now, update the tissues ---------------------- + + // program 1 minute interval on simulated tissues (Flagbit 7 = 0) + tissue_increment = 1; + + // compute current ppN2 and ppHe + sim_alveolar_presures(); + + // update the tissues + calc_tissue(); + } + + // commented out - char_O_deco_last_stop not used for anything + // surface not reached, need more stops... store reached depth for menu animation. + // if( !(char_O_deco_status & DECO_PLAN_ALTERNATE) ) char_O_deco_last_stop = temp_depth_limit; +} + + +////////////////////////////////////////////////////////////////////////////// +// Simulate ascent to first deco stop. +// +// +// Modified: temp_deco : current depth in ascent and deco simulation, in bar absolute pressure +// +void sim_ascent_to_first_stop(void) +{ + overlay unsigned char fast = 1; // 1 = 1 minute steps, 0 = 2 seconds steps + overlay unsigned char gaschange = 0; // 1 = do a gas change, 0 = no better gas available + + + //---- Loop until first deco stop or surface is reached ---------- + for(;;) + { + // depth in absolute pressure we came from + overlay float old_deco = temp_deco; + + // try ascending 1 full minute (fast) or 2 seconds (!fast) + if ( fast ) temp_deco -= float_ascent_speed * METER_TO_BAR; // 1 min at float_ascent_speed ( 5 .. 10 m/min) + else temp_deco -= (float_ascent_speed/30.0) * METER_TO_BAR; // 2 sec at float_ascent_speed (17 .. 33 cm/min) + + // but don't go over surface + if( temp_deco < pres_surface ) temp_deco = pres_surface; + + // compute sim_lead_tissue_limit + if ( char_I_deco_model != 0 ) sim_limit(GF_low); + else sim_limit(1.0); + + // did we overshoot the first deco stop? + if( temp_deco < sim_lead_tissue_limit ) + { + // YES - back to last depth below first stop + temp_deco = old_deco; + + // switch to 2 seconds ascent if not yet in, else done + if( fast ) + { + fast = 0; // retry with 2 seconds ascent steps + continue; + } + else + { + break; // done... + } + } + + // If code execution passes along here, we did not overshoot the first stop. + + // did we reach the surface? if yes, done! + if( temp_deco == pres_surface ) break; + + // depth in meters where we are now (no round-up) + temp_depth_limit = (unsigned char)((temp_deco - pres_surface) * BAR_TO_METER); + + // Check if there is a better gas to switch to, but only in alternative plan mode. + // If yes, introduce a stop for the gas change. + if( (char_O_deco_status & DECO_PLAN_ALTERNATE) && gas_find_better() ) + { + // depth in meters we came from + overlay unsigned char old_depth_limit = (unsigned char)((old_deco - pres_surface) * BAR_TO_METER); + + // adjust temp_depth_limit to the gas change depth, but not deeper than the depth we came from + temp_depth_limit = (sim_gas_last_depth < old_depth_limit) ? sim_gas_last_depth : old_depth_limit; + + // create a stop for the gas change + update_deco_table(char_I_gas_change_time); + + // set the new calculation values for N2, He and O2 + gas_switch_set(); + + // signal to create a stop for the gas change and update the tissues + gaschange = char_I_gas_change_time; + + // Adjust the depth for the tissue update to the stop depth. In case of fast mode, this + // imposes that the ascent from the 'old_deco' depth to this stop took 1 minute although + // we might have only ascended one or two meters... + temp_deco = temp_depth_limit * METER_TO_BAR + pres_surface; + } + + // Did one minute pass by and/or do we have a gas change? + // Remark: The 2 seconds ascent iterations towards the first deco stop in !fast speed may take + // up to 28 seconds in total - for this rough half of a minute no tissue updates will be computed. + // Well, it could be done by setting tissue_increment = 0 in !fast condition and making calls to + // sim_alveolar_presures() and calc_tissue() - see code commented out. + if( fast || gaschange ) + { + // program interval on simulated tissues (flag bit 7 = 0) + tissue_increment = fast + gaschange; + + // clear gas change signal + gaschange = 0; + // } + // else + // { + // // program 2 seconds interval on simulated tissues (flag bit 7 = 0) + // tissue_increment = 0; + // } + // { + // compute ppN2/ppHe for current depth from temp_deco + sim_alveolar_presures(); + + // update the tissues + calc_tissue(); + } + } +} + +////////////////////////////////////////////////////////////////////////////// +// Simulate extra time at the current depth. +// +// This routine is used for the futureTTS / delayed ascent feature. +// +void sim_extra_time(void) +{ + overlay unsigned char backup = tissue_increment; // back-up tissue_increment + + tissue_increment = char_I_extra_time; // program interval on simulated tissues (Flagbit 7 = 0) + + calc_tissue(); // update the tissues + + tissue_increment = backup; // restore tissue_increment +} + +////////////////////////////////////////////////////////////////////////////// +// calc_tissue +// +// optimized in v.101 +// +// INPUT: ppN2, ppHe, tissue_increment +// MODIFIED: pres_tissue_N2[], pres_tissue_He[] +// OUTPUT: char_O_tissue_N2_saturation[], char_O_tissue_He_saturation[] +// +static void calc_tissue() +{ + overlay float temp_tissue_N2; + overlay float temp_tissue_He; + overlay unsigned char period; + overlay unsigned char i; + + + assert( 0.00 <= ppN2 && ppN2 < 11.2 ); // 80% N2 at 130m + assert( 0.00 <= ppHe && ppHe < 12.6 ); // 90% He at 130m + + + for (ci=0;ci<NUM_COMP;ci++) // iterate through all compartments + { + i = tissue_increment & 127; // extract number of minutes to do (if i > 0) + // or if one 2 second period is to do (if i = 0) + + if( i == 0 ) // check if we shall do one 2-seconds period + { + read_Buhlmann_times(0); // YES, program coefficients for a 2 seconds period + period = 1; // set period length (in cycles) + i = 1; // and one cycle to do + } + else if( i > 9 ) // check if we can start with 10 minutes periods + { + read_Buhlmann_times(2); // YES, program coefficients for 10 minutes periods + period = 10; // set period length (in cycles) to ten + } + else // we shall do 1 to 9 minutes + { + read_Buhlmann_times(1); // program coefficients for 1 minute periods + period = 1; // set period length (in cycles) to one + } + + do + { + //---- N2 ------------------------------------------------------------------------------- + + temp_tissue = (tissue_increment & 128) ? pres_tissue_N2[ci] : sim_pres_tissue_N2[ci]; + + temp_tissue = (ppN2 - temp_tissue) * var_N2_e; + + temp_tissue_safety(); + + if( tissue_increment & 128 ) + { + // The temp variable takes on purpose just the tissue increment from the last loop's iteration. + temp_tissue_N2 = temp_tissue; + + // Update the real tissues if either we are on the 2 seconds interval, + // or if we shall advance the tissues on a one or several minutes basis. + if( twosectimer || (tissue_increment & 127) ) pres_tissue_N2[ci] += temp_tissue; + } + else + { + // Updates of the sim-tissues always comes on a 1 minutes basis, + // so we do not need to check of the 2 seconds interval. + sim_pres_tissue_N2[ci] += temp_tissue; + } + + + //---- He ------------------------------------------------------------------------------- + + temp_tissue = (tissue_increment & 128) ? pres_tissue_He[ci] : sim_pres_tissue_He[ci]; + + temp_tissue = (ppHe - temp_tissue) * var_He_e; + + temp_tissue_safety(); + + if( tissue_increment & 128 ) + { + // The temp variable takes on purpose just the tissue increment from the last loop's iteration. + temp_tissue_He = temp_tissue; + + // Update the real tissues if either we are on the 2 seconds interval, + // or if we shall advance the tissues on a one or several minutes basis. + if( twosectimer || (tissue_increment & 127) ) pres_tissue_He[ci] += temp_tissue; + + } + else + { + // Updates of the sim-tissues always comes on a 1 minutes basis, + // so we do not need to check of the 2 seconds interval. + sim_pres_tissue_He[ci] += temp_tissue; + } + + + // decrement loop counter + i -= period; + + // check if we need to switch from 10 minute periods to 1 minute periods + if( (i > 0) && (period = 10) && (i < 10) ) + { + read_Buhlmann_times(1); // program coefficients for 1 minute periods + period = 1; // set period length (in cycles) to one + } + } + while( i ); + + + // have the computations been done for the "real" tissues? + if( (tissue_increment & 128) && (twosectimer || (tissue_increment & 127)) ) + { + // net tissue balance + temp_tissue = temp_tissue_N2 + temp_tissue_He; + + // check tissue on-/off-gassing and IBCD with applying a threshold of +/-HYST + // + if ( temp_tissue < -HYST ) // Check if the tissue is off-gassing + { + deco_tissue_vector |= (1 << ci); // tag tissue as being in decompression + IBCD_tissue_vector &= ~(1 << ci); // tag tissue as not experiencing mentionable IBCD + } + else if ( temp_tissue > +HYST ) // check if the tissue in on-gassing + { + deco_tissue_vector &= ~(1 << ci); // tag tissue as not being in decompression + + if( ((temp_tissue_N2 > 0.0) && (temp_tissue_He < 0.0)) // check for counter diffusion + || ((temp_tissue_N2 < 0.0) && (temp_tissue_He > 0.0)) ) + { + IBCD_tissue_vector |= (1 << ci); // tag tissue as experiencing mentionable IBCD + } + } + + + // keep the saturating / desaturating flags from last invocation + char_O_tissue_N2_saturation[ci] &= 128; + char_O_tissue_He_saturation[ci] &= 128; + + // flip the flags applying a hysteresis of HYST (actual value: see #define of HYST) + if( temp_tissue_N2 > +HYST ) char_O_tissue_N2_saturation[ci] = 128; // set flag for tissue pressure is increasing + else if( temp_tissue_N2 < -HYST ) char_O_tissue_N2_saturation[ci] = 0; // clear flag (-> tissue pressure is decreasing) + + if( temp_tissue_He > +HYST ) char_O_tissue_He_saturation[ci] = 128; // set flag for tissue pressure is increasing + else if( temp_tissue_He < -HYST ) char_O_tissue_He_saturation[ci] = 0; // clear flag (-> tissue pressure is decreasing) + + + // For N2 tissue display purpose: + // Scale tissue press so that saturation in 70m on AIR gives a value of approx. 80. + // The surface steady-state tissue loading of [0.7902 * (pres_respiration - ppWater)] bar + // gives then a 10. If N2 is completely washed out of the tissue, result will be 0. + // This scaling is adapted to the capabilities of the tissue graphics in the custom views. + temp_tissue = (pres_tissue_N2[ci] / N2_equilibrium) * 10; + + // limit to 127 to leave space for sat/desat flag + if (temp_tissue > 127) temp_tissue = 127; + + // export as integer + char_O_tissue_N2_saturation[ci] += (unsigned char)temp_tissue; + + + // For H2 tissue display purpose: + // Scale tissue press so that saturation in 120m on TMX 10/70 gives a value of approx. 70. + // With no He in a tissue, result will be 0. + // This scaling is adapted to the capabilities of the tissue graphics in the custom views. + temp_tissue = pres_tissue_He[ci] * 7.7; + + // limit to 127 to leave space for sat/desat flag + if (temp_tissue > 127) temp_tissue = 127; + + // export as integer + char_O_tissue_He_saturation[ci] += (unsigned char)temp_tissue; + } + + }// for +} + +////////////////////////////////////////////////////////////////////////////// +// calc_limit +// +// New in v.111 : separated from calc_tissue(), and depends on GF value. +// +static void calc_limit(void) +{ + char_O_gtissue_no = 0; + calc_lead_tissue_limit = 0.0; + + // clear IBCD, microbubbles and outside warning flags (locked warnings will be preserved) + char_O_deco_warnings &= ~(DECO_WARNING_IBCD + DECO_WARNING_MBUBBLES + DECO_WARNING_OUTSIDE); + + + for(ci=0; ci<NUM_COMP; ci++) + { + overlay float N2 = pres_tissue_N2[ci]; + overlay float He = pres_tissue_He[ci]; + overlay float pres_tissue = N2 + He; + overlay float pres_min; + overlay float gf; + overlay float threshold; + + read_Buhlmann_coefficients(); + var_N2_a = (var_N2_a * N2 + var_He_a * He) / pres_tissue; + var_N2_b = (var_N2_b * N2 + var_He_b * He) / pres_tissue; + + // calculate minimum ambient pressure that the tissue can withstand according to straight Buhlmann + pres_min = (pres_tissue - var_N2_a) * var_N2_b; + + // calculate current gf value (1.0 = 100%) of this tissue + gf = (pres_tissue - pres_respiration) / (pres_tissue - pres_min); + if( gf < 0.0 ) gf = 0.0; + + // calculate a threshold value for use below + // ToDo: finalize the definition of the threshold + threshold = 0.02 * ci + 0.9; + + // check if this tissue is likely to develop microbubbles + // and/or if this tissue is outside the Buhlmann model + if( ci <= 5 ) + { + if( gf >= threshold ) + { + char_O_deco_warnings |= (DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock); + + if( gf >= 1.0 ) + { + char_O_deco_warnings |= (DECO_WARNING_OUTSIDE + DECO_WARNING_OUTSIDE_lock); + } + } + } + else + { + if( gf >= 1.0 ) + { + char_O_deco_warnings |= (DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock); + + if( gf >= threshold ) + { + char_O_deco_warnings |= (DECO_WARNING_OUTSIDE + DECO_WARNING_OUTSIDE_lock); + } + } + } + + + // Apply the Eric Baker's varying gradient factor correction if the GF-Model is selected. + // Note: the correction factor depends both on GF and b, + // Actual values are in the 1.5 .. 1.0 range (for a GF=30%), + // so that can change who is the leading gas... + // Note: Also depends of the GF. So the calculus is different for GF_low, current GF, or GF_high... + // *BUT* calc_tissue() is used to compute bottom time, hence what would happen at surface, + // hence at GF_high. + if( char_I_deco_model != 0 ) pres_min = ( pres_tissue - var_N2_a * ( GF_high) ) * var_N2_b + / ( GF_high + var_N2_b * (1.0 - GF_high) ); + + // check if this tissue requires a higher ambient pressure than was found to be needed up to now + if( pres_min > calc_lead_tissue_limit ) + { + char_O_gtissue_no = ci; + calc_lead_tissue_limit = pres_min; + } + } + + // check IBCD condition + if( !IBCD_tissue_vector ) + { + char_O_deco_warnings &= ~DECO_WARNING_IBCD; // no IBCD in any tissue, clear flag + } + else if( (IBCD_tissue_vector & (1 << char_O_gtissue_no)) + && ((pres_tissue_N2[char_O_gtissue_no] + pres_tissue_He[char_O_gtissue_no]) > pres_respiration) ) + { + // leading tissue is in IBCD condition and in super-saturation, set flags. + char_O_deco_warnings |= (DECO_WARNING_IBCD + DECO_WARNING_IBCD_lock); + } + + // check if is any tissue off-gassing + if (deco_tissue_vector) char_O_deco_warnings |= DECO_FLAG; // yes, set deco flag + else char_O_deco_warnings &= ~DECO_FLAG; // no, clear deco flag + + + assert( char_O_gtissue_no < NUM_COMP ); + assert( 0.0 <= calc_lead_tissue_limit && calc_lead_tissue_limit <= 14.0); +} + +////////////////////////////////////////////////////////////////////////////// +// calc_nullzeit +// +// calculates the remaining bottom time +// +// NOTE: Erik Baker's closed formula works for Nitroxes. Trimix adds a second +// exponential term to the M-value equation, making it impossible to +// invert... So we have to make a fast-simu until we find a better way. +// +// Input: pres_respiration +// Output: char_O_nullzeit / char_O_alternate_nullzeit +// +static void calc_nullzeit(void) +{ + overlay unsigned char nullzeit = 240; + + + //---- Compute ppN2 and ppHe --------------------------------------------- + temp_deco = pres_respiration; + sim_alveolar_presures(); + + for(ci=0; ci<NUM_COMP; ci++) + { + //---- Read A/B values and loading factor for N2 and He -------------- + + overlay float tN2 = sim_pres_tissue_N2[ci]; + overlay float tHe = sim_pres_tissue_He[ci]; + + overlay float t = tN2 + tHe; + overlay unsigned char ndl; + overlay unsigned char period = 10; + + read_Buhlmann_coefficients(); + read_Buhlmann_times(2); // Starts with a 10min period. + + //---- Simulate for that tissue -------------------------------------- + // NOTE: No need to simulate for longer than the already found NDL. + for(ndl=0; ndl<nullzeit;) + { + //---- Compute updated mix M-value at surface + overlay float a = (var_N2_a * tN2 + var_He_a * tHe) / t; + overlay float b = (var_N2_b * tN2 + var_He_b * tHe) / t; + overlay float M0 = (a + pres_surface/b); + + //---- Add 10min/1min to N2/He tissues + overlay float dTN2 = (ppN2 - tN2) * var_N2_e; + overlay float dTHe = (ppHe - tHe) * var_He_e; + + //---- Apply safety margin for both models + // NDL can be computed while ascending... SO we have + // to check if we are saturating or desaturating. + if( dTN2 > 0.0 ) dTN2 *= float_saturation_multiplier; + else dTN2 *= float_desaturation_multiplier; + + if( dTHe > 0.0 ) dTHe *= float_saturation_multiplier; + else dTHe *= float_saturation_multiplier; + + // adopt M0 value when using the GF extension + if (char_I_deco_model != 0 ) M0 = GF_high * (M0 - pres_surface) + pres_surface; + + //---- Simulate off-gassing while going to surface + // TODO ! + // dTN2 -= exp( ... ascent time ... ppN2...) + // dTHe -= exp( ... ascent time ... ppHe...) + + //---- Ok now, and still ok to surface after 1 or 10 minutes ? + if( (t <= M0) && (t + dTN2 + dTHe <= M0) ) + { + tN2 += dTN2; // YES: apply gas loadings, + tHe += dTHe; + t = tN2 + tHe; + + ndl += period; // increment NDL, + + continue; // and loop. + } + + //---- Should we retry with smaller steps ? + if( period == 10 ) + { + read_Buhlmann_times(1); // 1min coefs. + period = 1; + + continue; + } + + //---- ELSE make a linear approx for the last minute + // Useful to have a meaningful rounding of NDL. + // But ONLY if positive (negative casted to unsigned is bad). + if( M0 > t ) ndl += (unsigned char)(0.5f + (M0-t)/(dTN2+dTHe)); + + break; + } + + // Keep the shortest NDL found + if ( ndl < nullzeit ) nullzeit = ndl; + } + + if( char_O_deco_status & DECO_PLAN_ALTERNATE) char_O_alternate_nullzeit = nullzeit; + else char_O_nullzeit = nullzeit; +} + +////////////////////////////////////////////////////////////////////////////// +// calc_ascenttime +// +// Sum up ascent from bottom to surface at float_ascent_speed, +// but 1 minute per meter for the final ascent, and all stops. +// +// Result in int_O_ascenttime, +// or int_O_alternate_ascenttime if doing the alternative plan. +// +static void calc_ascenttime(void) +{ + overlay unsigned char x; + overlay unsigned short sum; + + // preset final ascent + overlay float final = (float)char_I_depth_last_deco; + + // calculate depth + overlay float ascent = (pres_respiration - pres_surface) * BAR_TO_METER; + + // check if we are already in final ascent + if (ascent <= final) + { + // yes - all ascent is final ascent + final = ascent; + ascent = 0.0; + } + else + { + // no - subtract final ascent part from overall ascent + ascent -= final; + + // compute time for ascent part without final ascent + ascent /= float_ascent_speed; + } + + // add 1 minute for each meter of final ascent + ascent += final; + + // convert to integer + sum = (unsigned short)(ascent + 0.5); + + // add all stop times + for(x=0; x<NUM_STOPS && internal_deco_depth[x]; x++) + sum += (unsigned short)internal_deco_time[x]; + + // limit result to display max. + if( sum > 999) sum = 999; + + // tag result as invalid if there is an overflow in the stops table + if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW ) sum |= INT_FLAG_INVALID; + + // route result to output variable + if( char_O_deco_status & DECO_PLAN_ALTERNATE ) int_O_alternate_ascenttime = sum; + else int_O_ascenttime = sum; +} + +////////////////////////////////////////////////////////////////////////////// +// update_startvalues +// +// updated in v.102 +// +void update_startvalues(void) +{ + overlay unsigned char x; + + // Start ascent simulation with current tissue partial pressures. + for(x=0; x<NUM_COMP; x++) + { + sim_pres_tissue_N2[x] = pres_tissue_N2[x]; + sim_pres_tissue_He[x] = pres_tissue_He[x]; + } + + // No leading tissue (yet) for this ascent simulation. + sim_lead_tissue_limit = 0.0; + sim_lead_tissue_no = 1; +} + +////////////////////////////////////////////////////////////////////////////// +// sim_limit() +// +// New in v.111 +// +// Function separated from calc_tissue() to allow recomputing limit on +// different depth, because it depends on current gradient factor. +// +static void sim_limit(PARAMETER float GF_current) +{ + assert( 0.0 < GF_current && GF_current <= 1.0 ); + + sim_lead_tissue_limit = 0.0; + sim_lead_tissue_no = 0; // If no one is critic, keep first tissue. + + for(ci=0; ci<NUM_COMP; ci++) + { + overlay float N2 = sim_pres_tissue_N2[ci]; + overlay float He = sim_pres_tissue_He[ci]; + overlay float p = N2 + He; + + read_Buhlmann_coefficients(); + var_N2_a = (var_N2_a * N2 + var_He_a * He) / p; + var_N2_b = (var_N2_b * N2 + var_He_b * He) / p; + + // Apply the Eric Baker's varying gradient factor correction. + // Note: the correction factor depends both on GF and b, + // Actual values are in the 1.5 .. 1.0 range (for a GF=30%), + // so that can change who is the leading gas... + // Note: Also depends of the GF_current... + if( char_I_deco_model != 0 ) p = ( p - (var_N2_a * GF_current) ) + / ( 1.0 - GF_current + (GF_current / var_N2_b ) ); + + else p = (p - var_N2_a) * var_N2_b; + + + if( p > sim_lead_tissue_limit ) + { + sim_lead_tissue_no = ci; + sim_lead_tissue_limit = p; + } + } // for ci + + assert( sim_lead_tissue_no < NUM_COMP ); + assert( 0.0 <= sim_lead_tissue_limit && sim_lead_tissue_limit <= 14.0 ); +} + +////////////////////////////////////////////////////////////////////////////// +// clear_deco_table +// +// +static void clear_deco_table(void) +{ + overlay unsigned char x; + + for(x=0; x<NUM_STOPS; ++x) + { + internal_deco_time [x] = 0; + internal_deco_depth[x] = 0; + } + + // clear stop table overflow warning + char_O_deco_warnings &= ~DECO_WARNING_STOPTABLE_OVERFLOW; +} + +////////////////////////////////////////////////////////////////////////////// +// update_deco_table +// +// Add time to a stop at temp_depth_limit +// +// It is possible to create stops with a duration of 0 minutes, e.g. to +// note a gas change "on the fly" while ascending. Therefore the criteria +// to have reached the end of the list needs always to be depth == 0. +// +// Input: temp_depth_limit : stop's depth, in meters. +// sim_gas_last_used : gas used at stop, as index 1..5 +// PARAMETER time_increment : number of minutes to add to the stop +// +// Updated: internal_deco_depth[] : depth (in meters) of each stop +// internal_deco_time [] : time (in minutes) of each stop +// internal_deco_gas [] : gas used (index 1-5) at each stop +// +static unsigned char update_deco_table(PARAMETER unsigned char time_increment) +{ + overlay unsigned char x; + + assert( temp_depth_limit > 0 ); // No stop at surface... + + // loop through internal deco table + for(x=0; x<NUM_STOPS; ++x) + { + // Make sure deco-stops are recorded in order: + assert( !internal_deco_depth[x] || temp_depth_limit <= internal_deco_depth[x] ); + + // Is there already a stop entry for our current depth? + if( internal_deco_depth[x] == temp_depth_limit ) + { + // Yes - increment stop time if possible + // Stop time entries are limited to 99 minutes because of display constraints. + // Else a limit of 254 would account because of constrains in calc_CNS_planning(). + if( internal_deco_time[x] < (99 - time_increment) ) + { + internal_deco_time[x] += time_increment; // increment stop time + return 1; // return with status 'success' + } + } + + // If program flow passes here, there is either no stop entry for the current depth yet, or + // the existing entry is saturated with 99 minutes. So we are looking for the next unused + // table entry. + if( internal_deco_depth[x] == 0 ) + { + internal_deco_time[x] = time_increment; // initialize entry with first stop's time, + internal_deco_depth[x] = temp_depth_limit; // ... depth, and + internal_deco_gas[x] = sim_gas_last_used; // ... gas + return 1; // return with status 'success' + } + } + + // If program flow passes here, all deco table entries are used up. + + // set overflow warning + char_O_deco_warnings |= DECO_WARNING_STOPTABLE_OVERFLOW; + + + // return with status 'failed'. + return 0; +} + +////////////////////////////////////////////////////////////////////////////// +// calc_gradient_factor +// +// optimized in v.101 (var_N2_a) +// new code in v.102 +// +static void calc_gradient_factor(void) +{ + overlay float gf; + overlay float N2 = pres_tissue_N2[char_O_gtissue_no]; + overlay float He = pres_tissue_He[char_O_gtissue_no]; + + assert( char_O_gtissue_no < NUM_COMP ); + assert( 0.800 <= pres_respiration && pres_respiration < 14.0 ); + + // tissue > respiration (currently off-gassing) + // GF = 0.00 when respiration == tissue, ie. dissolved gases are at equilibrium. + // GF = 1.00 when respiration == limit. + temp_tissue = N2 + He; + if( temp_tissue <= pres_respiration ) + { + gf = 0.0; + int_O_gradient_factor = 0; + } + else + { + overlay float limit = calc_lead_tissue_limit; + // NOTE: in GF model, calc_lead_tissue_limit include already the + // correction due to gradient factor. To compute the actual + // current GF, we need to (re-)compute the raw ambient-pressure + // limit from the Buhlmann model. + if( char_I_deco_model != 0 ) + { + ci = char_O_gtissue_no; + + read_Buhlmann_coefficients(); + + var_N2_a = (var_N2_a * N2 + var_He_a * He) / temp_tissue; + var_N2_b = (var_N2_b * N2 + var_He_b * He) / temp_tissue; + + limit = (temp_tissue - var_N2_a) * var_N2_b; + } + + gf = (temp_tissue - pres_respiration) / (temp_tissue - limit); + + // limit to 255 because of constraints in ghostwriter code + if ( gf <= 0.0 ) int_O_gradient_factor = 0; + else if( gf > 2.545 ) int_O_gradient_factor = 255 + INT_FLAG_WARNING; + else + { + int_O_gradient_factor = (unsigned int)(100 * gf + 0.5); + + if ( int_O_gradient_factor >= GF_warning_threshold ) int_O_gradient_factor |= INT_FLAG_WARNING; + else if ( int_O_gradient_factor >= GF_prewarning_threshold ) int_O_gradient_factor |= INT_FLAG_PREWARNING; + } + } +} + +////////////////////////////////////////////////////////////////////////////// +// calc_desaturation_time +// +// FIXED N2_ratio +// unchanged in v.101 +// Inputs: int_I_pres_surface, ppWater, char_I_desaturation_multiplier +// Outputs: int_O_desaturation_time, int_O_nofly_time +// +// Helper function +// +void calc_desaturation_time_helper(void) +{ + if( pres_actual > pres_target ) // check if actual pressure is higher then target pressure + { // YES - compute remaining time + overlay float pres_ratio; + + pres_ratio = pres_actual / pres_target; + + // Compute desaturation time with result rounded up to multiples of 10 minutes. + // Main purpose is to avoid confusion, because the times do not clock down in one minute steps any more + // but get constantly re-computed according to current ambient pressure and may therefor make steps of + // several minutes forwards and backwards as ambient pressure rises and falls. + short_time = (unsigned short)( (var_ht * log(pres_ratio) / desat_factor) + 0.9 ); + } + else + { // NO - desaturation state reached, no remaining time + short_time = 0; + } +} + +///////////////////////////////////////////////////////////////////////////// +// Main function +// +void calc_desaturation_time(void) +{ + assert( 800 < int_I_pres_surface && int_I_pres_surface < 1100 ); + assert( 0 < char_I_desaturation_multiplier && char_I_desaturation_multiplier <= 100 ); + + + N2_ratio = 0.7902; // fraction of N2 in respired air + pres_surface = 0.001 * int_I_pres_surface; // surface pressure in bar + N2_equilibrium = N2_ratio * (pres_surface - ppWater); // partial pressure of N2 in respired air + desat_factor = 0.06931 * char_I_desaturation_multiplier * SURFACE_DESAT_FACTOR; // pre-computed term for later use: + // 10 [Min] * 0.01 [%] * 0.6931 [ln(2)] * ... + int_O_desaturation_time = 0; + int_O_nofly_time = 0; + + + for(ci=NUM_COMP; ci>0;) + { + overlay float pres_tissue_max; + overlay float P_ambient_altitude; + overlay signed char search_direction; + overlay unsigned short nofly_N2 = 0; + overlay unsigned short nofly_He = 0; + overlay unsigned short nofly_last = ~0; + + + ci -= 1; + + read_Buhlmann_ht(); + read_Buhlmann_coefficients(); + + // get selected target altitude + switch( char_I_altitude_wait ) + { + case 1: P_ambient_altitude = P_ambient_1000m; break; + case 2: P_ambient_altitude = P_ambient_2000m; break; + case 3: P_ambient_altitude = P_ambient_3000m; break; + default: P_ambient_altitude = P_ambient_fly; break; + } + + // Target pressure for the tissue is the Buhlmann limit. We use the Buhlmann + // coefficients for N2 also for He because it is easier to calculate and the + // N2 coefficients are more conservative than those for He, so we are on the + // safe side, too. + pres_tissue_max = (P_ambient_altitude/var_N2_b + var_N2_a); + + // Adjust target pressure in case the GF model is in use by GF-high + if( char_I_deco_model != 0 ) + { + pres_tissue_max = ((pres_tissue_max - P_ambient_altitude) * char_I_GF_High_percentage * 0.01) + P_ambient_altitude; + } + + + // + // Desaturation time + // + + // N2: actual amount of tissue pressure above equilibrium. + pres_actual = pres_tissue_N2[ci] - N2_equilibrium; + + // N2: half-time of the current tissue + var_ht = var_N2_ht; + + // Calculate desaturation time for N2 in tissue. + // Desaturated state is defined as residual tissue pressure <= 1.05 x ppN2 respired + + pres_target = 0.05 * N2_equilibrium; + + calc_desaturation_time_helper(); + + if( short_time > int_O_desaturation_time) int_O_desaturation_time = short_time; + + + // He: actual amount of tissue pressure above equilibrium. + pres_actual = pres_tissue_He[ci]; // equilibrium for He is 0 bar + + // He: half-time of the current tissue + var_ht = var_He_ht; + + // Calculate desaturation time for He in the tissue. + // Desaturated state is defined as residual tissue pressure <= 0.05 x ppN2 respired + + pres_target = 0.05 * N2_equilibrium; + + calc_desaturation_time_helper(); + + if( short_time > int_O_desaturation_time) int_O_desaturation_time = short_time; + + + // + // no-fly time + // + + // initialize search direction + search_direction = 0; + + for(;;) + { + // N2: actual amount of tissue pressure above equilibrium. + pres_actual = pres_tissue_N2[ci] - N2_equilibrium; + + // N2: half-time of the current tissue + var_ht = var_N2_ht; + + // Calculate no-fly time for N2 in the tissue. + // Flying is permitted when the N2 pressure fits into the assigned fraction above equilibrium. + + pres_target = (split_N2_He[ci] * 0.01) * (pres_tissue_max - N2_equilibrium); + + if( pres_target < 0.0 ) // check if desaturation to fly target is possible + { + int_O_nofly_time = 288; // NO - set no-fly time to 288 * 10 min = 48 h + break; // done for this compartment + } + else + { + calc_desaturation_time_helper(); + nofly_N2 = short_time; + } + + // He: actual amount of tissue pressure above equilibrium - equilibrium for He is 0 bar. + pres_actual = pres_tissue_He[ci]; + + // He: half-time of the current tissue + var_ht = var_He_ht; + + // Calculate no-fly time for He in the tissue. + // Flying is permitted when the He pressure fits into the assigned fraction. + + pres_target = ((100 - split_N2_He[ci]) * 0.01) * (pres_tissue_max - N2_equilibrium); + + calc_desaturation_time_helper(); + nofly_He = short_time; + + + // Because the sum of N2 and He tissue pressures needs to fit into the Buhlmann limit for + // no-fly time calculation, each gas gets assigned a fraction of the available total pressure + // limit. The optimum split between the two gases can not be computed by a single formular, + // because this would require the inversion of a function with two exponential terms, which is + // not possible. We do not want to do a computational complex simulation here like it is done + // in the deco calculation code (although we tackle the same base problem here), so we just let + // the computer try out which split will balance the no-fly times induced by the N2 and the He + // at best. + + // first of all, skip any optimization in case the current compartment is not the leading one + if( (nofly_N2 <= int_O_nofly_time) && (nofly_He <= int_O_nofly_time) ) break; + + // check if the N2 requires more waiting time than the He + if( nofly_N2 >= nofly_He ) + { + // check if the search direction has changed, which means we are beyond the + // optimum now, or if we are at the upper stop limit of split_N2_He + if( (search_direction < 0) || (split_N2_He[ci] == 99) ) + { + // Either the just completed iteration was more close to the optimum or the one before + // was, so we take the best (i.e. shortest) time of both as the final no-fly time. + int_O_nofly_time = (nofly_N2 < nofly_last) ? nofly_N2 : nofly_last; + break; + } + + // store the no-fly time found in this iteration + nofly_last = nofly_N2; + + // increase the N2 fraction of the split and set search direction towards more N2 + split_N2_He[ci] += 1; + search_direction = +1; + } + else + { + // check if the search direction has changed, which means we are beyond the + // optimum now, or if we are at the lower stop limit of split_N2_He + if( (search_direction > 0) || (split_N2_He[ci] == 1) ) + { + // Either the just completed iteration was more close to the optimum or the one before + // was, so we take the best (i.e. shortest) time of both as the final no-fly time. + int_O_nofly_time = (nofly_He < nofly_last) ? nofly_He : nofly_last; + break; + } + + // store the no-fly time found in this iteration + nofly_last = nofly_He; + + // decrease the N2 fraction of the split and set search direction towards less N2 + split_N2_He[ci] -= 1; + search_direction = -1; + } + + } // for(;;) + + } // for(compartments) + + + // Rescale int_O_desaturation_time and int_O_nofly_time to full minutes for display purpose + int_O_desaturation_time *= 10; + int_O_nofly_time *= 10; + + // Limit int_O_desaturation_time and int_O_nofly_time to 5999 = 99 hours + 59 minutes + // because of display space constraints and rounding done above. + if( int_O_desaturation_time > 5999 ) int_O_desaturation_time = 5999; + if( int_O_nofly_time > 5999 ) int_O_nofly_time = 5999; + + + // Clear the microbubbles warning when the current gradient factor is < GF_warning_threshold. + // As the locked warning will stay set, this will cause the warning be be displayed in attention + // color instead of warning color. + if( int_O_gradient_factor < GF_warning_threshold ) char_O_deco_warnings &= ~DECO_WARNING_MBUBBLES; + + // clear some warnings when the desaturation time has become zero + if( int_O_desaturation_time == 0 ) char_O_deco_warnings &= ~( DECO_WARNING_IBCD + DECO_WARNING_IBCD_lock + + DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock + + DECO_WARNING_OUTSIDE + DECO_WARNING_OUTSIDE_lock ); + +} + +////////////////////////////////////////////////////////////////////////////// +// calc_wo_deco_step_1_min +// +// optimized in v.101 (...saturation_multiplier) +// desaturation slowed down to 70,42% +// +// Input: int_I_pres_surface [mbar] +// +static void calc_wo_deco_step_1_min(void) +{ + assert( 800 < int_I_pres_surface && int_I_pres_surface < 1100 ); + assert( 100 <= char_I_saturation_multiplier && char_I_saturation_multiplier < 200 ); + assert( 0 < char_I_desaturation_multiplier && char_I_desaturation_multiplier <= 100 ); + + // setup input data for deco routines + pres_respiration = pres_surface = int_I_pres_surface * 0.001; + + N2_ratio = 0.7902; // according to Buhlmann + N2_equilibrium = N2_ratio * (pres_surface - ppWater); // used for N2 tissue graphics scaling + ppN2 = N2_ratio * (pres_respiration - ppWater); + ppHe = 0.0; + + float_desaturation_multiplier = char_I_desaturation_multiplier * 0.01 * SURFACE_DESAT_FACTOR; + float_saturation_multiplier = char_I_saturation_multiplier * 0.01; + + + // program what to do: 128 = Flag for "real" tissues, 1 = 1 minute + tissue_increment = 128 + 1; + + // update the pressure in the tissues N2/He in accordance with the new ambient pressure + calc_tissue(); + + // clock down CNS by a 1 minute step + CNS_fraction *= 0.992327946; + + // compute integer copy of CNS value + compute_CNS_for_display(); + + // reset deco engine start condition (probably not needed to be done here...) + char_O_deco_status &= ~DECO_STATUS_MASK; // clear bits + char_O_deco_status |= DECO_STATUS_INIT; // set bits + + // reset some more data that are not applicable in surface mode + char_O_nullzeit = 0; + int_O_ascenttime = 0; + int_O_alternate_ascenttime = 0; + clear_deco_table(); + + // calculate gradient factor + calc_gradient_factor(); +} + +////////////////////////////////////////////////////////////////////////////// +// calc_dive_interval +// +// Prepare tissue for delay before the next dive simulation. +// +// Inputs: char_I_dive_interval == delay before dive (in 1 Minute steps). +// Modified: CNS_fraction, int_O_CNS_fraction +// pres_tissue_N2/He[] +// +// Should be protected by deco_push_tissues_to_vault(), +// deco_pull_tissues_from_vault() +// +// desaturation slowed down to 70,42%. +// +static void calc_dive_interval(void) +{ + overlay unsigned char t; + + //---- Initialize simulation parameters ---------------------------------- + pres_respiration = pres_surface = int_I_pres_surface * 0.001; + + N2_ratio = 0.7902; // according to buehlmann + N2_equilibrium = N2_ratio * (pres_surface - ppWater); // used for N2 tissue graphics scaling + ppN2 = N2_ratio * (pres_respiration - ppWater); + ppHe = 0.0; + + float_desaturation_multiplier = char_I_desaturation_multiplier * 0.01 * SURFACE_DESAT_FACTOR; + float_saturation_multiplier = char_I_saturation_multiplier * 0.01; + + //---- Perform simulation ------------------------------------------------ + + // Calculate tissues: + // Because tissue_increment is limited to 127 minutes, we have to do two passes + // in case char_I_dive_interval is bigger than 127. + // Ops: char_I_dive_interval must be limited to 254! + + t = char_I_dive_interval; + + if ( t == 255 ) t = 254; + + if ( t > 127 ) // extra pass needed? + { + tissue_increment = 127 // dive interval length in minutes + | 128; // Flag to update the "real" tissues + + calc_tissue(); // update tissues + + t -= 127; // calculate remaining dive interval length + } + + tissue_increment = t // dive interval length in minutes to do + | 128; // Flag to update the "real" tissues + calc_tissue(); // update tissues + + + // Calculate CNS: + // To speed up things and because on most invocations of this code char_I_dive_interval + // is a multiple of 10 minutes, we loop the loop-counter down using two speeds. + + t = char_I_dive_interval; + + while ( t ) + { + if( t > 9 ) + { + CNS_fraction *= 0.925874712; // Half-time = 90min -> 10 min: (1/2)^(1/9) + t -= 10; // fast speed looping + } + else + { + CNS_fraction *= 0.992327946; // Half-time = 90min -> 1 min: (1/2)^(1/90) + t -= 1; // slow speed looping + } + } + + // compute integer copy of CNS value + compute_CNS_for_display(); +} + +////////////////////////////////////////////////////////////////////////////// +// clear_CNS_fraction +// +// new in v.101 +// +void clear_CNS_fraction(void) +{ + CNS_fraction = CNS_sim_norm_fraction = CNS_sim_alt_fraction = 0; + int_O_CNS_fraction = int_O_normal_CNS_fraction = int_O_alternate_CNS_fraction = 0; +} + +////////////////////////////////////////////////////////////////////////////// +// calc_CNS_fraction +// +// Input: char_actual_ppO2 : current ppO2 [decibars] +// tissue_increment : time increment and tissue selector +// CNS_fraction : current CNS% as float before period +// +// Output: CNS_fraction, int_O_CNS_fraction - for the real tissues +// CNS_sim_norm_fraction, int_O_normal_CNS_fraction - in simulation mode, normal plan +// CNS_sim_alt_fraction, int_O_alternate_CNS_fraction - in simulation mode, alternative plan +// +void calc_CNS_fraction(void) +{ + overlay float time_factor = 1.0; // default is 2sec + overlay float CNS_fraction_temp = 0.0; + + assert( char_actual_ppO2 > 15 ); + + // All deco code is now invoked every second. But as the CNS update is based on + // 2 seconds periods, we skip every 2nd seconds-based invocation of this function. + // 128 = 128 (flag for "real" CNS) + 0 (2 seconds period) + // To distribute computational load, the CNS% is calculated in "the other second" + // than the tissues. + if( (tissue_increment == 128) && (twosectimer) ) return; + + // adjust time factor if minute-based stepping is commanded, mask out flag bit + if( tissue_increment & 127 ) time_factor = 30.0 * (float)(tissue_increment & 127); + + + //------------------------------------------------------------------------ + // Don't increase CNS below 0.5 bar, but keep it steady. + if (char_actual_ppO2 < 50) + ; // no changes + //------------------------------------------------------------------------ + // Below (and including) 1.60 bar + else if (char_actual_ppO2 < 61) + CNS_fraction_temp = time_factor/(-533.07 * char_actual_ppO2 + 54000.0); + else if (char_actual_ppO2 < 71) + CNS_fraction_temp = time_factor/(-444.22 * char_actual_ppO2 + 48600.0); + else if (char_actual_ppO2 < 81) + CNS_fraction_temp = time_factor/(-355.38 * char_actual_ppO2 + 42300.0); + else if (char_actual_ppO2 < 91) + CNS_fraction_temp = time_factor/(-266.53 * char_actual_ppO2 + 35100.0); + else if (char_actual_ppO2 < 111) + CNS_fraction_temp = time_factor/(-177.69 * char_actual_ppO2 + 27000.0); + else if (char_actual_ppO2 < 152) + CNS_fraction_temp = time_factor/( -88.84 * char_actual_ppO2 + 17100.0); + else if (char_actual_ppO2 < 167) + CNS_fraction_temp = time_factor/(-222.11 * char_actual_ppO2 + 37350.0); + //------------------------------------------------------------------------ + // Arieli et all.(2002): Modeling pulmonary and CNS O2 toxicity: + // J Appl Physiol 92: 248--256, 2002, doi:10.1152/japplphysiol.00434.2001 + // Formula (A1) based on value for 1.55 and c=20 + // example calculation: Sqrt((1.7/1.55)^20)*0.000404 + else if (char_actual_ppO2 < 172) + CNS_fraction_temp = time_factor*0.00102; + else if (char_actual_ppO2 < 177) + CNS_fraction_temp = time_factor*0.00136; + else if (char_actual_ppO2 < 182) + CNS_fraction_temp = time_factor*0.00180; + else if (char_actual_ppO2 < 187) + CNS_fraction_temp = time_factor*0.00237; + else if (char_actual_ppO2 < 192) + CNS_fraction_temp = time_factor*0.00310; + else if (char_actual_ppO2 < 198) + CNS_fraction_temp = time_factor*0.00401; + else if (char_actual_ppO2 < 203) + CNS_fraction_temp = time_factor*0.00517; + else if (char_actual_ppO2 < 233) + CNS_fraction_temp = time_factor*0.0209; + else + CNS_fraction_temp = time_factor*0.0482; // value for 2.5 bar, used for 2.33 bar and above + + + // Check from where we were called: + // flag (bit 7) is set -> we were called from calc_hauptroutine() + // flag (bit 7) not set -> we were called from the deco planning routines + if ( tissue_increment & 128 ) CNS_fraction += CNS_fraction_temp; // real tissues + else if ( char_O_deco_status & DECO_PLAN_ALTERNATE ) CNS_sim_alt_fraction += CNS_fraction_temp; // alternative plan + else CNS_sim_norm_fraction += CNS_fraction_temp; // normal plan + +} + +////////////////////////////////////////////////////////////////////////////// +// calc_CNS_planning +// +// Compute CNS during predicted ascent. +// +// Note: Needs a call to deco_push_tissues_to_vault(), +// deco_pull_tissues_from_vault() to avoid trashing everything... +// +// Input: CNS_fraction, internal_deco_time[], internal_deco_depth[], internal_deco_gas[] +// Output: CNS_fraction, int_O_normal_CNS_fraction / int_O_alternate_CNS_fraction +// +void calc_CNS_planning(void) +{ + // start with CNS% we already have + if( char_O_deco_status & DECO_PLAN_ALTERNATE ) CNS_sim_alt_fraction = CNS_fraction; + else CNS_sim_norm_fraction = CNS_fraction; + + + //---- CCR mode : do the full TTS at once --------------------------------- + + if( ((char_O_deco_status & DECO_MODE_MASK) == DECO_MODE_CCR) ) + { + overlay unsigned short t; // needs 16 bits here ! + + // get current ppO2 from sensors or setpoint + char_actual_ppO2 = char_I_const_ppO2; + + // calculate CNS% for the period of additional staying at bottom depth (fTTS / delayed ascent) + if( char_O_deco_status & DECO_ASCENT_DELAYED) + { + tissue_increment = char_I_extra_time; // must be limited to 127, is limited by range of char_I_extra_time + calc_CNS_fraction(); + } + + // get the ascent time dependent on the current plan + t = (char_O_deco_status & DECO_PLAN_ALTERNATE) ? int_O_alternate_ascenttime : int_O_ascenttime; + + // start simulating CNS% in chunks of 127 minutes + tissue_increment = 127; + + while( t > 127 ) + { + t -= 127; // tissue_increment is limited to 127 minutes because of flag in bit 7 + calc_CNS_fraction(); // calculate CNS in chunks of full 127 minutes + } + + tissue_increment = (char)t; // get the remaining minutes <= 127 + calc_CNS_fraction(); // calculate CNS for the remaining minutes + } + else //---- OC mode and pSCR without sensors: have to follow all gas switches... ----- + { + overlay float float_actual_ppO2; + overlay float abs_pres; + + overlay unsigned char stop_depth; + overlay unsigned char last_gas; + overlay unsigned char i; // stop table index + + + // retrieve bottom gas 0 (manual gas) or 1-5 (configured gases) + last_gas = sim_gas_last_used = sim_gas_first_used; + + // get the calc_N2/He/O2_ratios of the bottom gas + gas_switch_set(); + + // calculate absolute pressure + abs_pres = pres_surface + char_I_bottom_depth * METER_TO_BAR; + + // switch on deco mode pSCR / OC + if( char_O_deco_status & DECO_MODE_PSCR ) + { + //---- pSCR calculated -------------------------------------------- + + // abs_pres is 0.0 ... in bar + // calc_O2_ratio is 0.0 ... 1.0 as factor + // char_I_PSCR_drop is 0 ... 15 as % + // char_I_PSCR_lungratio is 5 ... 20 as % + // float_actual_ppO2 is 0.0 ... in cbar (!) + + float_actual_ppO2 = (100 * abs_pres * calc_O2_ratio) + - (1.0 - calc_O2_ratio) * char_I_PSCR_drop * char_I_PSCR_lungratio; + } + else + { + //---- OC --------------------------------------------------------- + + float_actual_ppO2 = abs_pres * calc_O2_ratio * 100; // in cbar (!) + } + + // caution: float_actual_ppO2 is in cbar here! + if ( float_actual_ppO2 < 0.0 ) char_actual_ppO2 = 0; + else if ( float_actual_ppO2 > 254.5 ) char_actual_ppO2 = 255; + else char_actual_ppO2 = (unsigned char)(float_actual_ppO2 + 0.5); + + + // simulate extended bottom time (fTTS) / delay before ascent (bailout) if configured + if( char_O_deco_status & DECO_ASCENT_DELAYED ) + { + tissue_increment = char_I_extra_time; // must be limited to 127, is limited by range of char_I_extra_time + calc_CNS_fraction(); + } + + + // For simplicity reason (non-linearity of the relation between ppO2 and CNS increments), the + // whole ascent is calculated with bottom ppO2. This errs, but it does so to the safe side. + + // calculate ascent time (integer division and generous round-up) + tissue_increment = char_I_bottom_depth / char_I_ascent_speed + 1; + + // commented out - not needed when char_I_ascent_speed is limited to a + // minimum of 2.something, it is indeed limited to 5. + // limit tissue_increment to 127 minutes + // if( tissue_increment > 127 ) tissue_increment = 127; + + // simulate the CNS increase + calc_CNS_fraction(); + + + //---- Stops --------------------------------------------------------- + + for(i=0; i<NUM_STOPS; ++i) + { + // get the depth of the stop + stop_depth = internal_deco_depth[i]; + + // did we reach the last entry (depth = 0)? if yes, done + if (stop_depth == 0) break; + + // get the duration of the stop and the gas breathed + tissue_increment = internal_deco_time[i]; + sim_gas_last_used = internal_deco_gas[i]; + + // do we have a gas switch? + if( sim_gas_last_used != last_gas ) + { + // yes - get new calc ratios + gas_switch_set(); + + // remember new gas as last gas + last_gas = sim_gas_last_used; + } + + // calculate absolute pressure at stop depth + abs_pres = pres_surface + stop_depth * METER_TO_BAR; + + // pSCR mode + if( char_O_deco_status & DECO_MODE_PSCR ) + { + // abs_pres is 0.0 ... in bar + // calc_O2_ratio is 0.0 ... 1.0 as factor + // char_I_PSCR_drop is 0 ... 15 as % + // char_I_PSCR_lungratio is 5 ... 20 as % + // float_actual_ppO2 is 0.0 ... in cbar (!) + + float_actual_ppO2 = (100 * abs_pres * calc_O2_ratio) + - (1.0 - calc_O2_ratio) * char_I_PSCR_drop * char_I_PSCR_lungratio; + } + else // OC mode + { + float_actual_ppO2 = abs_pres * calc_O2_ratio * 100; // in cbar (!) + } + + // caution: float_actual_ppO2 is in cbar here! + if ( float_actual_ppO2 < 0.0 ) char_actual_ppO2 = 0; + else if ( float_actual_ppO2 > 254.5 ) char_actual_ppO2 = 255; + else char_actual_ppO2 = (unsigned char)(float_actual_ppO2 + 0.5); + + + // ** Currently, stop times per stop entry are limited to 99 minutes in update_deco_table(), + // ** so the following code block is not needed at times. + // + // // tissue_increment is limited to 127 when fed to deco_calc_CNS_fraction(), + // // so if the stop is longer than 127 minutes (but not longer than 254 minutes!) + // // we need to calculate the CNS in two chunks. + // if( tissue_increment > 127) + // { + // tissue_increment -= 127; // subtract full 127 minutes and do the "remaining" minutes first + // calc_CNS_fraction(); + // tissue_increment = 127; // catch up with the previously subtracted full 127 minutes + // } + + // calculate CNS% for the stop + calc_CNS_fraction(); + } + } +} + +////////////////////////////////////////////////////////////////////////////// +// deco_calc_CNS_decrease_15min +// +// new in v.101 +// +// calculates the half time of 90 minutes in 6 steps of 15 min +// (Used in sleep mode, for low battery mode). +// +// Output: int_O_CNS_fraction +// Uses and Updates: CNS_fraction +// +void deco_calc_CNS_decrease_15min(void) +{ + RESET_C_STACK + + // clock down CNS + CNS_fraction = 0.890899 * CNS_fraction; + + // compute integer copy of CNS value + compute_CNS_for_display(); +} + + +////////////////////////////////////////////////////////////////////////////// +// gas_volumes +// +// calculates volumes and required tank fill pressures for each gas. +// +// Input: char_I_bottom_depth depth of the bottom segment +// char_I_bottom_time duration of the bottom segment +// char_I_extra_time extra bottom time for fTTS / delayed ascent +// float_ascent_speed ascent speed, in meters/minute +// sim_gas_first_used the bottom gas (1-5 for configured gases, 0 for the manual gas) +// internal_deco_depth[] depth of the stops +// internal_deco_time[] duration of the stops +// internal_deco_gas[] gas breathed at the stops +// char_I_bottom_usage gas consumption during bottom part and initial ascent, in liters/minute +// char_I_deco_usage gas consumption during stops and following ascents, in liters/minute +// char_I_tank_size[] size of the tanks for gas 1-5, in liters +// char_I_tank_pres_fill[] fill pressure of the tanks +// +// Output: int_O_gas_volumes[] amount of gas needed, in liters +// int_O_tank_pres_need[] in bar, + flags for fast evaluation by dive mode warnings: +// 2^15: pres_need >= pres_fill +// 2^14: pres_need >= press_fill * GAS_NEEDS_ATTENTION_THRESHOLD +// 2^11: pres_need == 0 +// 2^10: pres_need invalid +// +void gas_volumes_helper(void) +{ + // Calculate the gas volume needed at a given depth, time and usage (SAC rate). + // We use 1.0 for the surface pressure to have stable results when used through + // the deco calculator (simulation mode). + volume = (float_depth * METER_TO_BAR + 1.0) * float_time * usage; + + return; +} + +void gas_volumes(void) +{ + overlay float volumes[NUM_GAS]; + + overlay unsigned char stop_gas; + overlay unsigned char stop_gas_last; + overlay unsigned char stop_time; + overlay unsigned char stop_depth; + overlay unsigned char stop_depth_last; + overlay unsigned char i; + + + //---- initialization ---------------------------------------------------- + + // null the volume accumulators + for(i=0; i<NUM_GAS; ++i) volumes[i] = 0.0; + + // quit for CCR and pSCR mode + if( char_O_deco_status & DECO_MODE_LOOP ) goto done; + + + //---- bottom demand ----------------------------------------------------- + + // sim_gas_first_used : gas used during bottom segment (0, 1-5) + // char_I_bottom_depth: depth of the bottom segment + + assert(0 <= sim_gas_first_used && sim_gas_first_used <= NUM_GAS); + + // get the gas used during bottom segment + stop_gas_last = stop_gas = sim_gas_first_used; + + // set the usage (SAC rate) to bottom usage rate for bottom part and initial ascent + usage = char_I_bottom_usage; + + // volumes are only calculated for gases 1-5, but not the manually configured one + if( stop_gas ) + { + // set the bottom depth + float_depth = (float)char_I_bottom_depth; + + // calculate either bottom segment or fTTS / delayed ascent + if( char_O_deco_status & DECO_ASCENT_DELAYED ) + { + // duration of delayed ascent + float_time = (float)char_I_extra_time; + } + else + { + // duration of bottom segment + float_time = (float)char_I_bottom_time; + } + + // calculate gas demand + gas_volumes_helper(); + + // take result + volumes[stop_gas-1] = volume; + } + + + // initialize stop index with first stop + i = 0; + + + //---- initial ascent demand --------------------------------------------- + + // stop_gas : gas from bottom segment + // char_I_bottom_depth : depth of the bottom segment + // internal_deco_depth[i=0]: depth of the first stop, may be 0 if no stop exists + + // get the data of the first stop + stop_depth = internal_deco_depth[i]; + stop_time = internal_deco_time[i]; + + // volumes are only calculated for gases 1-5, but not the manually configured one + if( stop_gas ) + { + // compute distance between bottom and first stop + float_depth = (float)char_I_bottom_depth - (float)stop_depth; + + // initial ascent exists only if ascent distance is > 0 + if( float_depth > 0.0 ) + { + // compute ascent time + float_time = float_depth / float_ascent_speed; + + // compute average depth between bottom and first stop + float_depth = (float)char_I_bottom_depth - float_depth * 0.5; + + // calculate gas demand + gas_volumes_helper(); + + // add result + volumes[stop_gas-1] += volume; + } + } + + // switch the usage (SAC rate) to deco usage rate + // for stops, intermediate and final ascent + usage = char_I_deco_usage; + + // is there a (first) stop? if yes, goto stops processing + if( stop_depth ) goto stops; + + // add demand of a 3 minutes safety stop at 5 meters, at least for contingency... + float_time = 3.0; + float_depth = 5.0; + + // calculate gas demand + gas_volumes_helper(); + + // add result + volumes[stop_gas-1] += volume; + + // proceed to volume conversion and pressure calculations + goto done; + + + //---- intermediate ascent demand --------------------------------------- +inter_ascents: + + // store last stop depth and gas + stop_depth_last = stop_depth; + stop_gas_last = stop_gas; + + // check if we are at the end of the stops table + if( i < NUM_STOPS-1 ) + { + // there are more entries - get the next stop data + i++; + + // get the next stop depth + stop_depth = internal_deco_depth[i]; + + // check if there is indeed another stop, + // if not (depth = 0) treat as end of table + if( stop_depth == 0 ) goto end_of_table; + + // get the next stop duration + stop_time = internal_deco_time[i]; + } + else + { +end_of_table: + + // End of the stops table reached or no more stops: Split the remaining + // ascent into an intermediate ascent and a final ascent by creating a + // dummy stop at the usual last deco stop depth. Stop gas doesn't change. + stop_time = 0; + stop_depth = char_I_depth_last_deco; + } + + // volumes are only calculated for gases 1-5, but not the manually configured one + if( stop_gas_last ) + { + // compute distance between the two stops: + // last stop will always be deeper than current stop + float_depth = (float)(stop_depth_last - stop_depth); + + // compute ascent time + float_time = float_depth / float_ascent_speed; + + // compute average depth between the two stops + float_depth = (float)stop_depth_last - float_depth * 0.5; + + // calculate gas demand + gas_volumes_helper(); + + // add result + volumes[stop_gas_last-1] += volume; + } + + + //---- next stop demand ------------------------------------------------- +stops: + + // convert depth of the stop + float_depth = (float)stop_depth; + + // get the next gas + stop_gas = internal_deco_gas[i]; + + // do we we have a gas change? + if( stop_gas_last && (stop_gas != stop_gas_last) ) + { + // yes - spend an additional char_I_gas_change_time on the old gas + float_time = (float)char_I_gas_change_time; + + // calculate gas demand + gas_volumes_helper(); + + // add result + volumes[stop_gas_last-1] += volume; + } + + // calculate and add demand on new gas for the full stop duration + if( stop_gas ) + { + // get the duration of the stop + float_time = (float)stop_time; + + // calculate gas demand + gas_volumes_helper(); + + // add result to last gas + volumes[stop_gas-1] += volume; + } + + // continue with the next intermediate ascent if this was not the last stop + if( stop_depth > char_I_depth_last_deco ) goto inter_ascents; + + + //---- final ascent demand ----------------------------------------------- +final_ascent: + + // float_depth: depth of last stop + // stop_gas : gas from last stop (0 or 1-5) + + // volumes are only calculated for gases 1-5, but not the manually configured one + if( stop_gas ) + { + // set ascent time according to an ascent speed of 1 meter per minute + float_time = float_depth; + + // set half-way depth + float_depth *= 0.5; + + // calculate gas demand + gas_volumes_helper(); + + // add result + volumes[stop_gas-1] += volume; + } + + + //---- convert results for the assembler interface ----------------------------- +done: + + for(i=0; i<NUM_GAS; ++i) + { + if( volumes[i] >= 65534.5 ) + { + int_O_gas_volumes[i] = 65535; + int_O_tank_pres_need[i] = 999 + INT_FLAG_WARNING; // 999 bar + warning flag for > pres_fill + } + else + { + overlay unsigned short tank_pres_fill = 10.0 * (unsigned short)char_I_tank_pres_fill[i]; + + // No distinct rounding done here because volumes are not accurate to the single liter anyhow + + // convert gas volumes to integers + int_O_gas_volumes[i] = (unsigned short)volumes[i]; + + // compute how much pressure in the tank will be needed [in bar] (integer-division) + int_O_tank_pres_need[i] = (unsigned short)(int_O_gas_volumes[i] / char_I_tank_size[i]); + + // limit to 999 bar because of display constraints + if( int_O_tank_pres_need[i] > 999 ) int_O_tank_pres_need[i] = 999; + + // set flags for fast evaluation by divemode check for warnings + if ( int_O_tank_pres_need[i] == 0 ) + { + // set flag for 0 bar + int_O_tank_pres_need[i] |= INT_FLAG_ZERO; + } + else if( int_O_tank_pres_need[i] >= tank_pres_fill ) + { + // set warning flag + int_O_tank_pres_need[i] |= INT_FLAG_WARNING; + + } + else if( int_O_tank_pres_need[i] >= tank_pres_fill * GAS_NEEDS_ATTENTION_THRESHOLD ) + { + // set pre-warning flag + int_O_tank_pres_need[i] |= INT_FLAG_PREWARNING; + } + + // set invalid flag if there is an overflow in the stops table + if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW ) + int_O_tank_pres_need[i] |= INT_FLAG_INVALID; + + } // if( volumes[i] ) + } // for +} + +////////////////////////////////////////////////////////////////////////////// + +void compute_CNS_for_display(void) +{ + if ( CNS_fraction < 0.01 ) int_O_CNS_fraction = 0; + else if ( CNS_fraction >= 9.985 ) int_O_CNS_fraction = 999 + INT_FLAG_WARNING; + else + { + // convert float to integer + int_O_CNS_fraction = (unsigned short)(100 * CNS_fraction + 0.5); + + // compute warnings + if ( int_O_CNS_fraction >= CNS_warning_threshold ) + { + // reset pre-warning and set main warning flag + int_O_CNS_fraction &= ~INT_FLAG_PREWARNING; + int_O_CNS_fraction |= INT_FLAG_WARNING; + } + else if ( int_O_CNS_fraction >= CNS_prewarning_threshold ) + { + // reset main warning but set pre-warning flag + int_O_CNS_fraction &= ~INT_FLAG_WARNING; + int_O_CNS_fraction |= INT_FLAG_PREWARNING; + } + else + { + // clear both warnings + int_O_CNS_fraction &= ~(INT_FLAG_WARNING + INT_FLAG_PREWARNING); + } + } +} + +////////////////////////////////////////////////////////////////////////////// + +void deco_push_tissues_to_vault(void) +{ + overlay unsigned char x; + + RESET_C_STACK + + low_depth_norm_vault = low_depth_norm; + low_depth_alt_vault = low_depth_alt; + cns_vault_float = CNS_fraction; + cns_vault_int = int_O_CNS_fraction; + deco_warnings_vault = char_O_deco_warnings; + + for (x=0;x<NUM_COMP;x++) + { + pres_tissue_N2_vault[x] = pres_tissue_N2[x]; + pres_tissue_He_vault[x] = pres_tissue_He[x]; + } +} + +void deco_pull_tissues_from_vault(void) +{ + overlay unsigned char x; + + RESET_C_STACK + + low_depth_norm = low_depth_norm_vault; + low_depth_alt = low_depth_alt_vault; + CNS_fraction = cns_vault_float; + int_O_CNS_fraction = cns_vault_int; + char_O_deco_warnings = deco_warnings_vault; + + locked_GF_step_norm = GF_delta / low_depth_norm; + locked_GF_step_alt = GF_delta / low_depth_alt; + + for (x=0; x<NUM_COMP; x++) + { + pres_tissue_N2[x] = pres_tissue_N2_vault[x]; + pres_tissue_He[x] = pres_tissue_He_vault[x]; + } +} + +////////////////////////////////////////////////////////////////////////////// +// +#ifndef CROSS_COMPILE +void main() {} +#endif
--- a/src/p2_deco.c Wed Dec 27 14:34:11 2017 +0100 +++ b/src/p2_deco.c Wed Jan 31 19:39:37 2018 +0100 @@ -1,8 +1,8 @@ // ************************************************************** -// p2_deco.c +// p2_deco.c REFACTORED VERSION V2.95a2 // // Created on: 12.05.2009 -// Author: chsw +// Author: heinrichs weikamp, contributions by Ralph Lembcke and others // // ************************************************************** @@ -25,38 +25,15 @@ // ////////////////////////////////////////////////////////////////////////////// -// ***************************** -// ** I N T R O D U C T I O N ** -// ***************************** -// -// OSTC -// -// code: -// p2_deco_main_c_v101.c -// part2 of the OSTC code -// code with constant O2 partial pressure routines -// under construction !! -// -// summary: -// decompression routines -// for the OSTC experimental project -// written by Christian Weikamp -// last revision __________ -// comments added _________ -// -// additional files: -// p2_tables_v100.romdata (other files) -// 18f4685_ostc_v100.lkr (linker script) -// // history: // 01/03/08 v100: first release candidate // 03/13/08 v101: start of programming ppO2 code -// 03/13/25 v101a: backup of interrim version with ppO2 calculation +// 03/13/25 v101a: backup of interim version with ppO2 calculation // 03/13/25 v101: open circuit gas change during deco // 03/13/25 v101: CNS_fraction calculation // 03/13/26 v101: optimization of tissue calc routines // 07/xx/08 v102a: debug of bottom time routine -// 09/xx/08 v102d: Gradient Factor Model implemenation +// 09/xx/08 v102d: Gradient Factor Model implementation // 10/10/08 v104: renamed to build v103 for v118 stable // 10/14/08 v104: integration of char_I_depth_last_deco for Gradient Model // 03/31/09 v107: integration of FONT Incon24 @@ -71,7 +48,7 @@ // 2011/02/15: [jDG] Fixed inconsistencies introduced by gas switch delays. // 2011/03/21: [jDG] Added gas consumption (CF56 & CF57) evaluation for OCR mode. // 2011/04/15: [jDG] Store low_depth in 32bits (w/o rounding), for a better stability. -// 2011/04/25: [jDG] Added 1mn mode for CNS calculation, to allow it for decoplanning. +// 2011/04/25: [jDG] Added 1mn mode for CNS calculation, to allow it for deco planning. // 2011/04/27: [jDG] Fixed char_O_gradient_factor calculation when model uses gradient-factor. // 2011/05/02: [jDG] Added "Future TTS" function (CF58). // 2011/05/17: [jDG] Various cleanups. @@ -81,17 +58,18 @@ // 2012/02/24: [jDG] Remove missed stop bug. // 2012/02/25: [jDG] Looking for a more stable LOW grad factor reference. // 2012/09/10: [mH] Fill char_O_deco_time_for_log for logbook write -// 2012/10/05: [jDG] Better deco_gas_volumes accuracy (average depth, switch between stop). +// 2012/10/05: [jDG] Better gas_volumes accuracy (average depth, switch between stop). // 2013/03/05: [jDG] Should vault low_depth too. // 2013/03/05: [jDG] Wrobell remark: ascent_to_first_stop works better with finer steps (2sec). // 2013/05/08: [jDG] A. Salm remark: NOAA tables for CNS are in ATA, not bar. -// 2013/12/21: [jDG] Fix CNS calculation in decoplan w/o marked gas switch -// 2014/06/16: [jDG] Fix Helium diluant. Fix volumes with many travel mix. +// 2013/12/21: [jDG] Fix CNS calculation in deco plan w/o marked gas switch +// 2014/06/16: [jDG] Fix Helium diluent. Fix volumes with many travel mix. // 2014/06/29: [mH] Compute int_O_ceiling // 2015/06/12: [jDG] Fix NDL prediction while desaturating with the Buhlmann model. -// 2017/08/04: [mH] Switch to absolute GF everywhere and apply safety margin parameters to both models (GF and non-GF), fixes from Ralph Lembcke +// 2017/08/04: [mH] Switch to absolute GF everywhere and apply safety margin parameters to both models (GF and non-GF), fixes from Ralph Lembcke +// 2017/10/31: [rl] enhancements for pSCR mode and introduction of 2nd deco plan computation +// 2017/12/31: [rl] completion of 2nd deco plan computation and various up-fixes // -// TODO: // // Literature: // Buhlmann, Albert: Tauchmedizin; 4. Auflage [2002]; @@ -113,133 +91,280 @@ // *********************************************** #include "p2_definitions.h" -#define TEST_MAIN +#define TEST_MAIN #include "shared_definitions.h" -// Water vapour partial pressure in the lungs -#define ppWater 0.0627 -#define METER_TO_BAR 0.09985 -#define BAR_TO_METER 10.0150 // (1.0/METER_TO_BAR) - -// Surface security factor -#define SURFACE_DESAT_FACTOR 0.7042 + +// ambient pressure at different mountain heights +#define P_ambient_1000m 0.880 // [bar] based on 990 hPa and 20°C at sea level, 15°C at altitude +#define P_ambient_2000m 0.782 // [bar] +#define P_ambient_3000m 0.695 // [bar] + +// ambient pressure in aircraft cabin during flying - worst case according to Buhlmann +#define P_ambient_fly 0.600 // [bar], 0.600 bar is the value used by Buhlmann for his flying-after-diving calculations + // 0.735 bar is a typical cabin pressure for nowadays commercial jet aircrafts + // ----- + // 0.135 bar safety margin + +// constants and factors +#define ppWater 0.0627 // water vapor partial pressure in the lungs +#define METER_TO_BAR 0.09985 // conversion factor +#define BAR_TO_METER 10.0150 // conversion factor (1.0/METER_TO_BAR) +#define SURFACE_DESAT_FACTOR 0.7042 // surface desaturation safety factor +#define HYST 1.0E-06 // threshold for tissue graphics on-gassing / off-gassing visualization + +// thresholds +#define GF_warning_threshold 100 // threshold for GF warning (attention threshold is current GF_high) +#define CNS_warning_threshold 100 // threshold for CNS warning +#define CNS_prewarning_threshold 70 // threshold for CNS attention +#define ppO2_prewarn_threshold 120 // threshold for ppO2 attention (master warnings come through options_table.asm) +#define GAS_NEEDS_ATTENTION_THRESHOLD 0.70 // threshold for gas needs attention + +// deco engine states and modes - char_O_deco_status +#define DECO_STATUS_MASK 0x03 +#define DECO_STATUS_START 0x00 +#define DECO_STATUS_FINISHED 0x00 +#define DECO_STATUS_STOPS 0x01 +#define DECO_STATUS_ASCENT 0x02 +#define DECO_STATUS_INIT 0x03 + +#define DECO_MODE_MASK 0x0C +#define DECO_MODE_LOOP 0x04 +#define DECO_MODE_CCR 0x04 // to be used with == operator in combination with DECO_MODE_MASK only! +#define DECO_MODE_PSCR 0x08 + +#define DECO_PLAN_ALTERNATE 0x10 +#define DECO_CNS_CALCULATE 0x20 +#define DECO_VOLUME_CALCULATE 0x40 +#define DECO_ASCENT_DELAYED 0x80 + +// deco engine states and modes - char_O_main_status +//#define DECO_MODE_MASK 0x0C +//#define DECO_MODE_LOOP 0x04 +//#define DECO_MODE_CCR 0x04 // to be used with == operator in combination with DECO_MODE_MASK only! +//#define DECO_MODE_PSCR 0x08 +#define DECO_GASCHANGE_OVRD 0x10 +#define DECO_BOTTOM_CALCULATE 0x40 + + +// deco engine warnings +#define DECO_WARNING_IBCD 0x01 +#define DECO_WARNING_IBCD_lock 0x02 +#define DECO_WARNING_MBUBBLES 0x04 +#define DECO_WARNING_MBUBBLES_lock 0x08 +#define DECO_WARNING_OUTSIDE 0x10 +#define DECO_WARNING_OUTSIDE_lock 0x20 +#define DECO_WARNING_STOPTABLE_OVERFLOW 0x40 +#define DECO_FLAG 0x80 + +// flags used with integer numbers +#define INT_FLAG_INVALID 0x0400 +#define INT_FLAG_ZERO 0x0800 +#define INT_FLAG_LOW 0x1000 +#define INT_FLAG_HIGH 0x2000 +#define INT_FLAG_PREWARNING 0x4000 +#define INT_FLAG_WARNING 0x8000 + + // ************************* // ** P R O T O T Y P E S ** // ************************* static void calc_hauptroutine(void); -static void calc_nullzeit(void); - -static void calc_tissue(PARAMETER unsigned char period); -static void calc_limit(void); - -static void clear_tissue(void); -static void calc_ascenttime(void); -static void update_startvalues(void); -static void clear_deco_table(void); -static unsigned char update_deco_table(void); - -static void sim_tissue(PARAMETER unsigned char period); -static void sim_limit(PARAMETER float GF_current); -static void sim_extra_time(void); -static void calc_dive_interval(void); - -static void calc_gradient_factor(void); -static void calc_wo_deco_step_1_min(void); - static void calc_hauptroutine_data_input(void); static void calc_hauptroutine_update_tissues(void); static void calc_hauptroutine_calc_deco(void); +static void calc_tissue(void); +static void calc_limit(void); +static void calc_nullzeit(void); +static void calc_ascenttime(void); +static void calc_dive_interval(void); +static void calc_gradient_factor(void); +static void calc_wo_deco_step_1_min(void); +static void calc_desaturation_time(void); + +static void sim_extra_time(void); static void sim_ascent_to_first_stop(void); - -static unsigned char gas_switch_deepest(void); +static void sim_limit(PARAMETER float GF_current); + +static void update_startvalues(void); static void gas_switch_set(void); - +static void compute_CNS_for_display(void); + +static void clear_deco_table(void); +static void clear_tissue(void); + +static unsigned char gas_find_better(void); static unsigned char calc_nextdecodepth(void); +static unsigned char update_deco_table(PARAMETER unsigned char time_increment); + //---- Bank 5 parameters ----------------------------------------------------- #ifndef UNIX # pragma udata bank5=0x500 #endif -static float GF_low; -static float GF_high; -static float GF_delta; -static float locked_GF_step; // GF_delta / low_depth - -static unsigned char temp_depth_limit; -float low_depth; // Depth of deepest stop - -// Simulation context: used to predict ascent. -static unsigned char sim_lead_tissue_no; // Leading compatiment number. -static float sim_lead_tissue_limit; // Buhlmann tolerated pressure. - -// Real context: what we are doing now. -static float calc_lead_tissue_limit; // - -static unsigned char internal_deco_time[NUM_STOPS]; -static unsigned char internal_deco_depth[NUM_STOPS]; - -static float cns_vault; -static float low_depth_vault; -static float pres_tissue_N2_vault[NUM_COMP]; -static float pres_tissue_He_vault[NUM_COMP]; +// general deco parameters + +static float GF_low; // initialized from deco parameters, constant during all computations +static float GF_high; // initialized from deco parameters, constant during all computations +static float GF_delta; // initialized from deco parameters, constant during all computations +static float locked_GF_step_norm; // GF_delta / low_depth_norm in normal plan +static float locked_GF_step_alt; // GF_delta / low_depth_alt in alternative plan + +static float low_depth_norm; // Depth of deepest stop in normal plan +static float low_depth_alt; // Depth of deepest stop in alternative plan + +static float float_ascent_speed; // ascent speed from options_table (1.0 .. 10.0 m/min) +static float float_saturation_multiplier; // safety factor for on-gassing rates +static float float_desaturation_multiplier; // safety factor for off-gassing rates +static float float_deco_distance; // additional depth below stop depth for tissue, CNS and gas volume calculation + + +// real context: what we are doing now. + +static float calc_lead_tissue_limit; // minimum tolerated ambient pressure by Buhlmann model +static float CNS_fraction; // current CNS (1.00 = 100%) + +static unsigned short deco_tissue_vector; // 32 bit vector to memories all tissues that are in decompression +static unsigned short IBCD_tissue_vector; // 32 bit vector to memories all tissues that experience IBCD + +// simulation context: used to predict ascent. + +static float sim_lead_tissue_limit; // minimum tolerated ambient pressure by Buhlmann model +static float CNS_sim_norm_fraction; // CNS at end of dive in normal plan +static float CNS_sim_alt_fraction; // CNS at end of dive in alternative plan + +static unsigned char temp_depth_limit; // depth of next stop in meters, used in deco calculations +static unsigned char sim_lead_tissue_no; // Leading compartment number +static unsigned char split_N2_He[NUM_COMP]; // used for calculating the desaturation time + + +// stops table + +static unsigned char internal_deco_depth[NUM_STOPS]; // depth of the stop +static unsigned char internal_deco_time[NUM_STOPS]; // duration of the stop +static unsigned char internal_deco_gas[NUM_STOPS]; // gas used at the stop + + +// transfer variables between calc_desaturation_time() and calc_desaturation_time_helper() + +static float desat_factor; // used to cache a pre-computed factor +static float var_ht; // buffer for a half-time factor +static float pres_target; // target pressure for a compartment +static float pres_actual; // current pressure of the compartment +static unsigned short short_time; // time it takes for the compartment to reach the target pressure + +// transfer variables between gas_volumes() and gas_volumes_helper() +static float float_depth; // depth of the stop or half-way point +static float float_time; // duration of the stop or ascent phase +static float volume; // computed volume of gas +static unsigned char usage; // gas usage in l/min + + +// 44 byte free space left in this bank + //---- Bank 6 parameters ----------------------------------------------------- #ifndef UNIX # pragma udata bank6=0x600 #endif -static unsigned char ci; -static float pres_respiration; -static float pres_surface; -static float temp_deco; -static float ppN2; -static float ppHe; -static float temp_tissue; -static float N2_ratio; // Breathed gas nitrogen ratio. -static float He_ratio; // Breathed gas helium ratio. -static float var_N2_a; // Buhlmann a, for current N2 tissue. -static float var_N2_b; // Buhlmann b, for current N2 tissue. -static float var_He_a; // Buhlmann a, for current He tissue. -static float var_He_b; // Buhlmann b, for current He tissue. -static float var_N2_e; // Exposition, for current N2 tissue. -static float var_He_e; // Exposition, for current He tissue. -static float var_N2_ht; // Half-time for current N2 tissue. -static float var_He_ht; // Half-time for current N2 tissue. - -static float pres_diluent; // new in v.101 -static float const_ppO2; // new in v.101 - -static unsigned char sim_gas_last_depth; // Depth of last used gas, to detected a gas switch. -static unsigned char sim_gas_last_used; // Number of last used gas, to detected a gas switch. -static unsigned short sim_dive_mins; // Simulated dive time. -static float calc_N2_ratio; // Simulated (switched) nitrogen ratio. -static float calc_He_ratio; // Simulated (switched) helium ratio. -static float CNS_fraction; // new in v.101 -static float float_saturation_multiplier; // new in v.101 -static float float_desaturation_multiplier; // new in v.101 -static float float_deco_distance; // new in v.101 - -static unsigned char deco_gas_change[NUM_GAS]; // new in v.109 -static unsigned char internal_deco_gas [NUM_STOPS]; +// indexing and sequencing + +static unsigned char ci; // used as index to the Buhlmann tables +static unsigned char twosectimer = 0; // used for timing the tissue updating +static unsigned char tissue_increment; // Selector for real/simulated tissues and time increment + + +// environmental and gas data + +static float pres_respiration; // current depth in absolute pressure +static float pres_surface; // absolute pressure at the surface +static float temp_deco; // simulated current depth in abs.pressure, used for deco calculations + +static unsigned char bottom_depth; // bottom depth in meters, used by CNS and gas needs calculation + +static float O2_ratio; // real breathed gas oxygen ratio +static float N2_ratio; // real breathed gas nitrogen ratio +static float He_ratio; // real breathed gas helium ratio + +static float calc_O2_ratio; // simulated breathed gas oxygen ratio +static float calc_N2_ratio; // simulated breathed gas nitrogen ratio +static float calc_He_ratio; // simulated breathed gas helium ratio + +static float O2_ppO2; // ppO2 - calculated for pure oxygen at current depth +static float pSCR_ppO2; // ppO2 - calculated for breathed from pSCR loop +static float pure_ppO2; // ppO2 - calculated for breathed in OC mode + +static unsigned char char_actual_ppO2; // ppO2 - assumed to be breathed, as integer 100 = 1.00 bar + +static float breathed_ppO2; // partial pressure of breathed oxygen +static float ppN2; // partial pressure of breathed nitrogen +static float ppHe; // partial pressure of breathed helium + + +// Buhlmann model parameters + +static float var_N2_a; // Buhlmann a, for current N2 tissue +static float var_N2_b; // Buhlmann b, for current N2 tissue +static float var_He_a; // Buhlmann a, for current He tissue +static float var_He_b; // Buhlmann b, for current He tissue +static float var_N2_e; // exposition, for current N2 tissue +static float var_He_e; // exposition, for current He tissue +static float var_N2_ht; // half-time for current N2 tissue +static float var_He_ht; // half-time for current N2 tissue + + +// gas switch history + +static unsigned char sim_gas_first_used; // Number of first used gas, for bottom segment +static unsigned char sim_gas_last_used; // number of last used gas +static unsigned char sim_gas_last_depth; // change depth of last used gas + + +// vault to back-up & restore tissue data + +static float pres_tissue_N2_vault[NUM_COMP]; // stores the nitrogen tissue pressures +static float pres_tissue_He_vault[NUM_COMP]; // stores the helium tissue pressures +static float low_depth_norm_vault; // stores a parameter of the GF model for normal plan +static float low_depth_alt_vault; // stores a parameter of the GF model for alternative plan +static float cns_vault_float; // stores current CNS (float representation) + +static unsigned int cns_vault_int; // stores current CNS (integer representation) +static unsigned char deco_warnings_vault; // stores warnings status + + +// auxiliary variables for local data buffering + +static float N2_equilibrium; // used for N2 tissue graphics scaling +static float temp_tissue; // auxiliary variable to buffer tissue pressures + + +// 6 byte free space left in this bank + //---- Bank 7 parameters ----------------------------------------------------- #ifndef UNIX # pragma udata bank7=0x700 #endif - // Keep order of 0x700 variables -float pres_tissue_N2[NUM_COMP]; -float pres_tissue_He[NUM_COMP]; -float sim_pres_tissue_N2[NUM_COMP]; // 16 floats = 64 bytes. -float sim_pres_tissue_He[NUM_COMP]; // 16 floats = 64 bytes. + +// Keep order and position of the variables in bank 7 as they are backed-up to & restored from EEPROM + +float pres_tissue_N2[NUM_COMP]; // 16 floats = 64 bytes +float pres_tissue_He[NUM_COMP]; // 16 floats = 64 bytes +float sim_pres_tissue_N2[NUM_COMP]; // 16 floats = 64 bytes +float sim_pres_tissue_He[NUM_COMP]; // 16 floats = 64 bytes + //---- Bank 8 parameters ----------------------------------------------------- #ifndef UNIX # pragma udata overlay bank8=0x800 - static char md_pi_subst[256]; -# define C_STACK md_pi_subst // Overlay C-code data stack here, too. + +static char md_pi_subst[256]; // Overlay C-code data stack here, too. + +# define C_STACK md_pi_subst #endif // Back to bank6 for further tmp data @@ -256,10 +381,10 @@ // End of PROM code is 17F00, So push tables on PROM top... // #ifndef UNIX -# pragma romdata buhlmann_tables = 0x1DD00 // Needs to be in UPPER bank. +# pragma romdata Buhlmann_tables = 0x1DD00 // Needs to be in UPPER bank. #endif -rom const float buhlmann_ab[4*16] = { +rom const float Buhlmann_ab[4*16] = { // Data ZH-L16C, from Bühlmann Tauchmedizin 2002, option 1a (4mn) // a for N2 b for N2 a of He b for He 1.2599, 0.5050, 1.7424, 0.4245, @@ -280,9 +405,9 @@ 0.2327, 0.9653, 0.5119, 0.9267 }; -rom const float buhlmann_ht[2*16] = { -// Compartiment half-life, in minute -//-- N2 ---- He --------------------------------------------------------------------- +rom const float Buhlmann_ht[2*16] = { +// Compartment half-life, in minute +//--- N2 ---- He ---------------------- 4.0, 1.51, 8.0, 3.02, 12.5, 4.72, @@ -302,7 +427,7 @@ }; rom const float e2secs[2*16] = { -// result of 1 - 2^(-1/(30sec*HT)) +// result of 1 - 2^(-1/(2sec*HT)) //---- N2 ------------- He ------------ 5.75958E-03, 1.51848E-02, 2.88395E-03, 7.62144E-03, @@ -428,7 +553,7 @@ ////////////////////////////////////////////////////////////////////////////// // Fast subroutine to read timer 5. -// Note: result is in 1/32 of msecs (30,51757813 us/bit to be precise) +// Note: result is in 1/32 of milliseconds (30,51757813 us/bit to be precise) static unsigned short tmr5(void) { #ifndef CROSS_COMPILE @@ -441,11 +566,10 @@ #endif } - ////////////////////////////////////////////////////////////////////////////// -// read buhlmann tables A and B for compatriment ci +// read Buhlmann tables A and B for compartment ci // -static void read_buhlmann_coefficients(void) +static void read_Buhlmann_coefficients(void) { #ifndef CROSS_COMPILE // Note: we don't use far rom pointer, because the @@ -463,7 +587,7 @@ // Use an interleaved array (AoS) to access coefficients with a // single addressing. { - overlay rom const float* ptr = &buhlmann_ab[4*ci]; + overlay rom const float* ptr = &Buhlmann_ab[4*ci]; var_N2_a = *ptr++; var_N2_b = *ptr++; var_He_a = *ptr++; @@ -472,11 +596,11 @@ } ////////////////////////////////////////////////////////////////////////////// -// read buhlmann tables for compatriment ci +// read Buhlmann tables for compartment ci // If period == 0 : 2sec interval // 1 : 1 min interval // 2 : 10 min interval. -static void read_buhlmann_times(PARAMETER char period) +static void read_Buhlmann_times(PARAMETER char period) { #ifndef CROSS_COMPILE // Note: we don't use far rom pointer, because the @@ -524,9 +648,9 @@ } ////////////////////////////////////////////////////////////////////////////// -// read buhlmann tables for compatriment ci +// read Buhlmann tables for compartment ci // -static void read_buhlmann_ht(void) +static void read_Buhlmann_ht(void) { #ifndef CROSS_COMPILE @@ -542,7 +666,7 @@ assert( ci < NUM_COMP ); { - overlay rom const float* ptr = &buhlmann_ht[2*ci]; + overlay rom const float* ptr = &Buhlmann_ht[2*ci]; var_N2_ht = *ptr++; var_He_ht = *ptr++; } @@ -557,8 +681,7 @@ // new in v.102 // // INPUT, changing during dive: -// temp_deco -// low_depth +// temp_deco : current depth in absolute pressure // // INPUT, fixed during dive: // pres_surface @@ -566,139 +689,200 @@ // GF_high // GF_low // char_I_depth_last_deco -// float_deco_distance // -// RETURN TRUE iff a stop is needed. +// MODIFIED +// locked_GF_step_norm/_alt : used for GF model +// low_depth_norm/_alt : used for GF model // // OUTPUT -// locked_GF_step -// temp_depth_limt -// low_depth +// temp_depth_limit : depth of next stop in meters (if RETURN == true ) +// depth we can ascent to without stop (if RETURN == false) +// +// RETURN TRUE if a stop is needed. // static unsigned char calc_nextdecodepth(void) { - //--- Max ascent speed --------------------------------------------------- - // Recompute leading gas limit, at current depth: + overlay unsigned char need_stop; + + // compute current depth in meters overlay float depth = (temp_deco - pres_surface) * BAR_TO_METER; - // At most, ascent 1 minute, at 10m/min == 10.0 m. - overlay float min_depth = (depth > 10.0) ? (depth - 10.0) : 0.0; - - // Do we need to stop at current depth ? - overlay unsigned char need_stop = 0; - - assert( depth >= -0.2 ); // Allow for 200mbar of weather change. - - //---- ZH-L16 + GRADIENT FACTOR model ------------------------------------ + // compute depth in meters after 1 minute of ascent at float_ascent_speed (5..10 m/min) + overlay float min_depth = (depth > float_ascent_speed) ? (depth - float_ascent_speed) : 0.0; + + + // allow for 200mbar of weather dependent surface pressure change + assert( depth >= -0.2 ); + + + //---- check if a stop is needed for deco reasons ---------------------------- + + // switch on deco model if( char_I_deco_model != 0 ) { + //---- ZH-L16 + GRADIENT FACTOR Model ------------------------------------ + + overlay float locked_GF_step; + overlay float low_depth; + overlay float pres_gradient; + overlay unsigned char first_stop = 0; - overlay float p; - + + + // calculate minimum depth we can ascent to in absolute pressure sim_limit( GF_low ); - p = sim_lead_tissue_limit - pres_surface; - if( p <= 0.0f ) - goto no_deco_stop; // We can surface directly... - - p *= BAR_TO_METER; - + + // ...and convert the depth into relative pressure + pres_gradient = sim_lead_tissue_limit - pres_surface; + + // check if we can surface directly + if( pres_gradient <= 0.0 ) + { + min_depth = 0.0; // set minimum depth to 0 meters = surface + goto no_deco_stop; // done. + } + + // convert minimum depth we can ascent to from relative pressure to depth in meters + pres_gradient *= BAR_TO_METER; + + // recall low_depth dependent on current plan + low_depth = (char_O_deco_status & DECO_PLAN_ALTERNATE) ? low_depth_alt : low_depth_norm; + // Store the deepest point needing a deco stop as the LOW reference for GF. - // NOTE: following stops will be validated using this LOW-HIGH gf scale, + // NOTE: following stops will be validated using this LOW-HIGH GF scale, // so if we want to keep coherency, we should not validate this stop // yet, but apply the search to it, as for all the following stops afterward. - if( p > low_depth ) + if( pres_gradient > low_depth ) { - low_depth = p; + // update GF parameters + low_depth = pres_gradient; locked_GF_step = GF_delta / low_depth; + + // store updated GF parameters dependent on current plan + if( char_O_deco_status & DECO_PLAN_ALTERNATE ) + { + low_depth_alt = low_depth; + locked_GF_step_alt = locked_GF_step; + } + else + { + low_depth_norm = low_depth; + locked_GF_step_norm = locked_GF_step; + } } - - if( p < min_depth ) - goto no_deco_stop; // First stop is higher than 1' ascent. - - // Round to multiple of 3m. - first_stop = 3 * (short)(0.9995f + p*0.333333f); + else + { + // recall locked_GF_step dependent on current plan + locked_GF_step = (char_O_deco_status & DECO_PLAN_ALTERNATE) ? locked_GF_step_alt : locked_GF_step_norm; + } + + // invalidate this stop if we can ascent for 1 minute without going above minimum required deco depth + if( pres_gradient < min_depth ) goto no_deco_stop; + + + // if program execution passes here, we need a deco stop + + // Round to multiple of 3 meters + first_stop = 3 * (unsigned char)(0.9995 + pres_gradient * 0.333333); + + // check a constraint assert( first_stop < 128 ); - // Apply correction for the shallowest stop. - if( first_stop == 3 ) // new in v104 - first_stop = char_I_depth_last_deco; // Use last 3m..6m instead. + // apply correction for the shallowest stop, use char_I_depth_last_deco (3..6 m) instead + if( first_stop == 3 ) first_stop = char_I_depth_last_deco; // We have a stop candidate. // But maybe ascending to the next stop will diminish the constraint, - // because the GF might decrease more than the preassure gradient... + // because the GF might decrease more than the pressure gradient... while(first_stop > 0) { - overlay unsigned char next_stop; // Next depth (0..90m) - - // Check max speed, or reaching surface. - if( first_stop <= min_depth ) - goto no_deco_stop; - - if( first_stop <= char_I_depth_last_deco ) // new in v104 - next_stop = 0; - else if( first_stop == 6 ) - next_stop = char_I_depth_last_deco; - else - next_stop = first_stop - 3; // Index of next (upper) stop. - - // Total preassure at the new stop candidate: - p = next_stop * METER_TO_BAR - + pres_surface; - - // Recompute limit for this new stop: - if( !low_depth || next_stop > low_depth ) - sim_limit( GF_low ); - else - sim_limit( GF_high - next_stop * locked_GF_step ); - - // Check upper limit (lowest ambiant pressure tolerated): - if( sim_lead_tissue_limit >= p ) - goto deco_stop_found; // Ascent to next_stop forbiden. - - // Else, validate that stop and loop... + // Next depth + overlay unsigned char next_stop; + + // invalidate this stop if we can ascent one more minute without going above minimum required deco depth + if( first_stop <= (unsigned char)min_depth ) goto no_deco_stop; + + // compute depth of next stop + if ( first_stop <= char_I_depth_last_deco ) next_stop = 0; + else if ( first_stop == 6 ) next_stop = char_I_depth_last_deco; + else next_stop = first_stop - 3; + + // compute total pressure at the new stop candidate + pres_gradient = next_stop * METER_TO_BAR + pres_surface; + + // compute limit for the new stop candidate + if( (low_depth == 0.0) || (next_stop > low_depth) ) sim_limit( GF_low ); + else sim_limit( GF_high - next_stop * locked_GF_step ); + + // check if ascent to the next stop candidate is possible + if( sim_lead_tissue_limit >= pres_gradient ) goto deco_stop_found; // no - ascent to next_stop forbidden + + // else, validate that stop and loop... first_stop = next_stop; } no_deco_stop: - temp_depth_limit = min_depth; - goto done; + need_stop = 0; // set flag for stop needed to 'no' + temp_depth_limit = (unsigned char)min_depth; // report depth we can ascent to without stop + goto done; deco_stop_found: - // next stop is the last validated depth found, aka first_stop - need_stop = 1; // Hit. - temp_depth_limit = first_stop; // Stop depth, in meter. + need_stop = 1; // set flag for stop needed to 'yes' + temp_depth_limit = (unsigned char)first_stop; // stop depth, in meters done: ; } - else //---- ZH-L16 model ------------------------------------------------- + else { + //---- ZH-L16 model ------------------------------------------------- + overlay float pres_gradient; - // Original model - // optimized in v.101 - // char_I_depth_last_deco included in v.101 - - // Compute sim_lead_tissue_limit too, but just once. + + // calculate minimum depth we can ascent to in absolute pressure sim_limit(1.0); + // ...and convert the depth into relative pressure pres_gradient = sim_lead_tissue_limit - pres_surface; + + // check if we can surface directly if (pres_gradient >= 0) { - pres_gradient *= BAR_TO_METER/3; // bar --> stop number; - temp_depth_limit = 3 * (short) (pres_gradient + 0.99); // --> metre : depth for deco - need_stop = 1; // Hit. - - // Implement last stop at 4m/5m/6m... - if( temp_depth_limit == 3 ) - temp_depth_limit = char_I_depth_last_deco; + // no - set flag for stop needed to 'yes' + need_stop = 1; + + // convert stop depth in relative pressure to stop index + pres_gradient *= BAR_TO_METER / 3; + + // convert stop index to depth in meters, rounded to multiple of 3 meters + temp_depth_limit = 3 * (short) (pres_gradient + 0.99); + + // correct last stop to 4m/5m/6m + if( temp_depth_limit == 3 ) temp_depth_limit = char_I_depth_last_deco; } else + { + // yes - set flag for stop needed to 'no' + need_stop = 0; + + // set depth we can ascent to as 0 = surface temp_depth_limit = 0; + } } - //---- Check gas change -------------------------------------------------- - need_stop |= gas_switch_deepest(); // Update temp_depth_limit if there is a change, + + // After the first deco stop, gas changes are only done at deco stops now! + + // check if a stop is found and there is a better gas to switch to + if( need_stop && gas_find_better() ) + { + // set the new calculation ratios for N2, He and O2 + gas_switch_set(); + + // prime the deco stop with the gas change time + update_deco_table(char_I_gas_change_time); + } return need_stop; } @@ -743,13 +927,13 @@ //---- Third: fill table end with null for(y++; y<NUM_STOPS; y++) { - char_O_deco_time_for_log [y] = 0; + char_O_deco_time_for_log[y] = 0; } } } ////////////////////////////////////////////////////////////////////////////// -// temp_tissue_safety // +// temp_tissue_safety // // outsourced in v.102 // @@ -760,10 +944,8 @@ assert( 0.0 < float_desaturation_multiplier && float_desaturation_multiplier <= 1.0 ); assert( 1.0 <= float_saturation_multiplier && float_saturation_multiplier <= 2.0 ); - if( temp_tissue < 0.0 ) - temp_tissue *= float_desaturation_multiplier; - else - temp_tissue *= float_saturation_multiplier; + if( temp_tissue < 0.0 ) temp_tissue *= float_desaturation_multiplier; + else temp_tissue *= float_saturation_multiplier; } ////////////////////////////////////////////////////////////////////////////// @@ -774,19 +956,18 @@ ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// -// Called every 2 seconds during diving. -// update tissues every time. +// Called every second during diving. +// updates tissues every second invocation. // -// Every 6 seconds (or slower when TTS > 16): -// - update deco table (char_O_deco_time/depth) with new values. -// - update ascent time, -// - set status to zero (so we can check there is new results). +// Every few seconds (or slower when TTS > 16): +// - updates deco table (char_O_deco_time/depth) with new values. +// - updates ascent time, +// - sets status to zero (so we can check there is new results). // void deco_calc_hauptroutine(void) { RESET_C_STACK calc_hauptroutine(); - int_O_desaturation_time = 65535; } ////////////////////////////////////////////////////////////////////////////// @@ -801,22 +982,19 @@ } ////////////////////////////////////////////////////////////////////////////// -// Called every 1 min during decoplanning. -// Update tissues for 1 min. -// -void deco_calc_tissue(void) -{ - RESET_C_STACK - calc_hauptroutine_update_tissues(); -} - -////////////////////////////////////////////////////////////////////////////// void deco_calc_wo_deco_step_1_min(void) { RESET_C_STACK calc_wo_deco_step_1_min(); - deco_calc_desaturation_time(); + } + +////////////////////////////////////////////////////////////////////////////// + +void deco_calc_desaturation_time(void) +{ + RESET_C_STACK + calc_desaturation_time(); } ////////////////////////////////////////////////////////////////////////////// @@ -828,144 +1006,255 @@ } ////////////////////////////////////////////////////////////////////////////// -// Find current gas in the list (if any). +// deco_calc_CNS_decrease_15min // -// Input: char_I_current_gas = 1..6 +// new in v.101 // -// Output: sim_gas_last_depth = 0..5, temp_depth_limit. +// calculates the half time of 90 minutes in 6 steps of 15 min +// (Used in sleep mode, for low battery mode). // -static void gas_switch_find_current(void) +// Output: int_O_CNS_fraction +// Uses and Updates: CNS_fraction +// +void deco_calc_CNS_decrease_15min(void) { - assert( 0 < char_I_current_gas && char_I_current_gas <= (2*NUM_GAS) ); - - if( char_I_current_gas <= NUM_GAS ) // Gas1..Gas5 + RESET_C_STACK + + // clock down CNS + CNS_fraction = 0.890899 * CNS_fraction; + + // compute integer copy of CNS value + compute_CNS_for_display(); +} + + +////////////////////////////////////////////////////////////////////////////// +// Find current gas in the list (if any) and get its change depth +// +// Input: char_I_current_gas : 1..5 or 6 +// +// Output: sim_gas_last_used : 1..6 or 0 if it is the gas set as FIRST +// sim_gas_last_depth : change depth in meters or 0 if it is the gas set as FIRST +// +static void gas_find_current(void) +{ + assert( 1 <= char_I_current_gas && char_I_current_gas <= 6 ); + + if( char_I_current_gas <= NUM_GAS ) // Gas 1-5 { - sim_gas_last_used = char_I_current_gas; - - // Note: if current is first gas, we must find it, but not set - // last depth change to surface. - if( char_I_deco_gas_change[sim_gas_last_used-1] ) - sim_gas_last_depth = char_I_deco_gas_change[sim_gas_last_used-1]; + sim_gas_last_used = sim_gas_first_used = char_I_current_gas; + + // If current gas is a deco gas get it's change depth. + // Set change depth to 0 if the current gas is the first gas or + // a travel/normal gas, i.e. if it can be breathed at "any" depth. + if( char_I_deco_gas_change[sim_gas_last_used-1] ) sim_gas_last_depth = char_I_deco_gas_change[sim_gas_last_used-1]; + else sim_gas_last_depth = 0; } else - sim_gas_last_used = 0; // Gas 6 = manual set + { + sim_gas_last_used = sim_gas_first_used = 0; // Gas 6 (the manually set one) has number 0 here + sim_gas_last_depth = 0; // handle it as a travel/normal gas + } +} + + +////////////////////////////////////////////////////////////////////////////// +// Find the deco gas with the shallowest change depth beyond current depth +// +// INPUT temp_depth_limit : current depth in meters +// char_I_deco_gas_change[] : change depths of the deco gases +// sim_gas_last_depth : change depth of the currently used gas, 0 if on the gas set as FIRST +// +// OUTPUT sim_gas_last_depth : switch depth - only if return value is true +// sim_gas_last_used : index of the gas (1..5) - only if return value is true +// +// RETURNS TRUE if a better gas is available +// +static unsigned char gas_find_better(void) +{ + overlay unsigned char switch_depth = 255; + overlay unsigned char switch_gas = 0; + overlay unsigned char j; + + + // no automatic gas changes in CCR mode and - as of now - in pSCR mode + if( char_O_deco_status & DECO_MODE_LOOP ) return 0; + + // Loop over all deco gases to find the shallowest one below or at current depth. + for(j=0; j<NUM_GAS; ++j) + { + // Is this the gas we are already breathing? + // If yes, skip this gas. + if( j+1 == sim_gas_last_used ) continue; + + // Is the change depth of the gas shallower than the current depth? + // If yes, skip this gas as it is not to be used yet. + // Remark: this check will also skip all disabled gases and the gas set + // as 'first' because these have their change depth set to 0. + if( temp_depth_limit > char_I_deco_gas_change[j] ) continue; + + // Is the change depth of the gas deeper than the change depth of the + // gas we are currently one? + // If yes, skip this gas as it is not better than the current one. + // Remark: if there is more than one gas with the same change depth, + // the last one from the list will be taken. + if( sim_gas_last_depth && (char_I_deco_gas_change[j] > sim_gas_last_depth) ) continue; + + // Is the change depth of the gas shallower or equal to the change depth + // of the best gas found so far, or is it the first better gas found? + // If yes, we have a better gas + if( char_I_deco_gas_change[j] <= switch_depth ) + { + switch_gas = j+1; // remember this gas (1..5) + switch_depth = char_I_deco_gas_change[j]; // remember its change depth + } + } // continue looping through all gases to eventually find an even better gas + + // has a better gas been found? + if( switch_gas ) + { + // yes + sim_gas_last_used = switch_gas; // report the index of the better + sim_gas_last_depth = switch_depth; // report its change depth + + assert( sim_gas_last_depth < switch_depth ); + + return 1; // signal a better gas was found + } + else + { + return 0; // signal no better gas was found + } } ////////////////////////////////////////////////////////////////////////////// -// Find deepest available gas. -// -// Input: temp_depth_limit, -// deco_gas_change[] -// sim_gas_depth_used, sim_dive_mins. -// -// RETURNS TRUE if a stop is needed for gas switch. +// Set calc_N2/He/O2_ratios by sim_gas_last_used // -// Output: temp_depth_limit, sim_gas_depth_used IFF the is a switch. +// Input: sim_gas_last_used : index of gas to use +// N2_ratio, He_ratio : if gas 0 = the manually set gas is in use // -// NOTE: might be called from bottom (when sim_gas_delay and sim_gas_depth_used -// are null), or during the ascent to make sure we are not passing a -// stop (in which case both can be already set). +// Output: calc_N2_ratio, calc_He_ratio, calc_O2ratio // -static unsigned char gas_switch_deepest(void) +static void gas_switch_set(void) { - overlay unsigned char switch_deco = 0, switch_last = 0; - - if (char_I_const_ppO2 == 0) - { - overlay unsigned char j; - - // Loop over all enabled gas, to find the deepest one, - // above last used gas, but below temp_depth_limit. - for(j=0; j<NUM_GAS; ++j) - { - // Gas not (yet) allowed ? Skip ! - if( temp_depth_limit > deco_gas_change[j] ) - continue; - - // Gas deeper (or equal) than the current one ? Skip ! - if( sim_gas_last_depth && deco_gas_change[j] >= sim_gas_last_depth ) - continue; - - // First, or deeper ? - if( switch_deco < deco_gas_change[j] ) - { - switch_deco = deco_gas_change[j]; - switch_last = j+1; // 1..5 - } - } - } - - // If there is a better gas available - if( switch_deco ) - { - assert( !sim_gas_last_depth || sim_gas_last_depth > switch_deco ); - - sim_gas_last_depth = switch_deco; - sim_gas_last_used = switch_last; - } - return 0; + assert( 0 <= sim_gas_last_used <= NUM_GAS ); + + if( sim_gas_last_used == 0 ) // Gas6 = manually set gas. + { + calc_O2_ratio = O2_ratio; + calc_He_ratio = He_ratio; + } + else + { + calc_O2_ratio = char_I_deco_O2_ratio[sim_gas_last_used-1] * 0.01; + calc_He_ratio = char_I_deco_He_ratio[sim_gas_last_used-1] * 0.01; + } + + calc_N2_ratio = 1.0 - calc_O2_ratio - calc_He_ratio; + + assert( 0.0 <= calc_N2_ratio && calc_N2_ratio <= 0.95 ); + assert( 0.0 <= calc_He_ratio && calc_He_ratio <= 1.00 ); + assert( (calc_N2_ratio + calc_He_ratio) <= 1.00 ); } ////////////////////////////////////////////////////////////////////////////// -// Calculate gas switches -// -// -// Input: N2_ratio, He_ratio. -// sim_gas_last_used -// -// Output: calc_N2_ratio, calc_He_ratio -// -static void gas_switch_set(void) -{ - assert( sim_gas_last_used <= NUM_GAS ); - - if( sim_gas_last_used == 0 ) // Gas6 = manualy set gas. - { - calc_N2_ratio = N2_ratio; - calc_He_ratio = He_ratio; - } - else - { - calc_N2_ratio = char_I_deco_N2_ratio[sim_gas_last_used-1] * 0.01; - calc_He_ratio = char_I_deco_He_ratio[sim_gas_last_used-1] * 0.01; - } - - assert( 0.0 <= calc_N2_ratio && calc_N2_ratio <= 0.95 ); - assert( 0.0 <= calc_He_ratio && calc_He_ratio <= 1.00 ); - assert( (calc_N2_ratio + calc_He_ratio) <= 1.00 ); -} - -////////////////////////////////////////////////////////////////////////////// +// Compute ppN2 and ppHe // // Input: calc_N2_ratio, calc_He_ratio : simulated gas mix. -// temp_deco : simulated respiration pressure -// float_deco_distance : security factor. -// Water-vapor pressure inside limbs (ppWater). +// temp_deco : simulated respiration pressure +// float_deco_distance : safety factor +// ppWater : water-vapor pressure inside respiratory tract // // Output: ppN2, ppHe. // static void sim_alveolar_presures(void) { - overlay float deco_diluent = temp_deco; // new in v.101 + overlay float deco_diluent = temp_deco; + + // read ppO2 reported from sensors or by setpoint // TODO: can be deleted + // char_actual_ppO2 = char_I_const_ppO2; + // Take deco offset into account, but not at surface. - // Note: this should be done on ambiant pressure, hence before - // computing the diluant partial pressure... - if( deco_diluent > pres_surface ) - deco_diluent += float_deco_distance; - - //---- CCR mode : deco gas switch ? -------------------------------------- - if( char_I_const_ppO2 != 0 ) + // Note: this should be done on ambient pressure, hence before + // computing the diluent partial pressure... + if( deco_diluent > pres_surface ) deco_diluent += float_deco_distance; + + if( char_O_deco_status & DECO_MODE_LOOP ) { - // In CCR mode, use calc_XX_ratio instead of XX_ratio. - // Note: PPO2 and ratios are known outside the lumbs, so there is no - // ppWater in the equations below: + //---- Loop mode : adjust ppN2 and ppHe for change in ppO2 due to setpoint (CCR) or drop (pSCR)------- + + // get current setpoint (CCR) or sensor value (CCR, for pSCR see text below) as default + overlay float const_ppO2 = char_I_const_ppO2 * 0.01; + + if( char_O_deco_status & DECO_MODE_PSCR ) + { + //---- PSCR mode : compute loop gas ---------------------------------------- + // + // As the ppO2 in the loop changes with water depth, we can not use the current + // sensor value as with CCR mode, but need to compute the ppO2 for the given depth. + // Then we continue with the CCR mode code which calculates the increases of ppN2 + // and ppH2 due to the reduction of the ppO2 in the loop. Essentially, diving a + // PSCR is like diving a CCR with a setpoint lower than the ambient pressure x the + // O2 fraction of the diluent would yield... + // + + // deco_diluent is 0.0 ... in bar + // calc_O2_ratio is 0.0 ... 1 as factor + // char_I_PSCR_drop is 0 ... 15 as % + // char_I_PSCR_lungratio is 5 ... 20 as % + // const_ppO2 is 0.0 ... in bar + + const_ppO2 = (deco_diluent * calc_O2_ratio) - (1 - calc_O2_ratio) * 0.01 * char_I_PSCR_drop * char_I_PSCR_lungratio; + + // capture failure condition + if( const_ppO2 < 0.0 ) const_ppO2 = 0.0; + } + else + { + + //---- CCR mode ------------------------------------------------------------ + + // Limit the setpoint to the maximum physically possible ppO2. This prevents for + // example calculating with a setpoint of 1.3 bar in only 2 meters of depth. + // Additionally, if limiting occurs, the ppO2 can be further reduced to account + // for residual inert gases by the user-adjustable setting char_I_cc_max_frac_o2. + + if( const_ppO2 > deco_diluent ) // no ppWater subtracted here to give some margin for + { // sensors delivering data a little bit over target + + const_ppO2 = 0.01 * char_I_cc_max_frac_o2 * (deco_diluent - ppWater); + } + } + + if ( const_ppO2 == 0.0 ) char_actual_ppO2 = 0; + else if ( const_ppO2 > 2.545 ) char_actual_ppO2 = 255; + else char_actual_ppO2 = (unsigned char)(const_ppO2*100 + 0.5); + + // Note: ppO2 and ratios are known outside the lungs, so there is no ppWater in the equations below: deco_diluent -= const_ppO2; - deco_diluent /= calc_N2_ratio + calc_He_ratio;// potential DIV/0 issue when O2 is used as diluent! + deco_diluent /= calc_N2_ratio + calc_He_ratio; - if(calc_N2_ratio==0&calc_He_ratio==0) deco_diluent = 0.0; // workaround for potential DIV/0 issue + // capture all failure conditions, including div/0 in case diluent is pure O2 + if( (deco_diluent < 0.0) || (calc_O2_ratio > 99.5) ) + { + deco_diluent = 0.0; + + char_actual_ppO2 = (unsigned char)(temp_deco*100 + 0.5); // without float_deco_distance here as this situation + // is likely to occur only at 6 meters or shallower + } } - + else + { + //---- OC mode: char_actual_ppO2 will be needed for CNS calculation later -------------------------------- + + overlay float ppO2 = pres_respiration * calc_O2_ratio; + + if ( ppO2 > 2.545 ) char_actual_ppO2 = 255; + else char_actual_ppO2 = (unsigned char)(ppO2*100 + 0.5); + } + + if( deco_diluent > ppWater ) { ppN2 = calc_N2_ratio * (deco_diluent - ppWater); @@ -976,6 +1265,7 @@ ppN2 = 0.0; ppHe = 0.0; } + assert( 0.0 <= ppN2 && ppN2 < 14.0 ); assert( 0.0 <= ppHe && ppHe < 14.0 ); } @@ -990,30 +1280,35 @@ // static void clear_tissue(void) { - overlay float p; - - // Kludge: the 0.0002 of 0.7902 are missing with standard air. - N2_ratio = 0.7902; - pres_respiration = int_I_pres_respiration * 0.001; - - p = N2_ratio * (pres_respiration - ppWater); + pres_respiration = 0.001 * int_I_pres_respiration; + N2_equilibrium = 0.7902 * (pres_respiration - ppWater); + for(ci=0; ci<NUM_COMP; ci++) { // cycle through the 16 Buhlmann N2 tissues - pres_tissue_N2[ci] = p; - - // cycle through the 16 Buhlmann tissues for Helium - pres_tissue_He[ci] = 0.0; + pres_tissue_N2[ci] = N2_equilibrium; // initialize data for "real" tissue + char_O_tissue_N2_saturation[ci] = 11; // initialize data for tissue graphics + + + // cycle through the 16 Buhlmann He tissues + pres_tissue_He[ci] = 0.0; // initialize data for "real" tissue + char_O_tissue_He_saturation[ci] = 0; // initialize data for tissue graphics } + clear_CNS_fraction(); + clear_deco_table(); - char_O_deco_status = 0; - char_O_nullzeit = 0; - int_O_ascenttime = 0; - char_O_gradient_factor = 0; - - calc_lead_tissue_limit = 0.0; - char_O_gtissue_no = 0; + + char_O_main_status = 0; + char_O_deco_status = 0; + char_O_nullzeit = 0; + char_O_gtissue_no = 0; + char_O_deco_warnings = 0; + + int_O_ascenttime = 0; + int_O_gradient_factor = 0; + + calc_lead_tissue_limit = 0.0; } ////////////////////////////////////////////////////////////////////////////// @@ -1024,100 +1319,344 @@ // the bottom time, // and simulates the ascend with all deco stops. // -// The deco_state sequence is : -// 3 (at surface) -// +---> 0 : calc nullzeit -// | 2 : simulate ascent to first stop (at 10m/min, less that 16x 1min simu) -// | +-> 1 : simulate up to 16min of stops. -// | +------< not finished -// +--------< finish -// -// Added steps 6,5 for @+5 calculation: -// 6 = ascent to first stop (same as 2), except continue to 7 -// 7 = same as 1, except loop to 7. // static void calc_hauptroutine(void) { - static unsigned char backup_gas_used = 0; - static unsigned char backup_gas_depth = 0; - - calc_hauptroutine_data_input(); - - calc_hauptroutine_update_tissues(); - calc_gradient_factor(); - - // toggle between calculation for nullzeit (bottom time), - // deco stops - // and more deco stops (continue) - switch( char_O_deco_status ) + unsigned int int_ppO2_min; + unsigned int int_ppO2_max; + + + //--- set-up part -------------------------------------------------------------------------------- + + // twosectimer: + // calc_hauptroutine is now invoked every second to speed up the deco planning. + // Because the tissue and CNS calculations are based on a 2 seconds period, the + // the following toggle-timer will be used by the respective routines to skip + // every 2nd invocation. + twosectimer = (twosectimer) ? 0 : 1; // toggle the toggle-timer + + + // set up normal tissue updating or "fast forward" updating for simulator sim+5' function + // and deco calculator bottom time calculation + if( char_I_sim_advance_time > 0 ) + { + // configure char_I_sim_advance_time minutes of tissue updating + tissue_increment = char_I_sim_advance_time // given number of minutes, limited to 127 + | 128; // set flag for updating the "real" tissues & CNS + + char_I_sim_advance_time = 0; // clear "mailbox" + } + else + { + // configure 2 seconds of tissue updating + tissue_increment = 0 // encoding for 2 seconds update + | 128; // set flag for updating the "real" tissues & CNS + } + + //---- calculate the real tissue's data ----------------------------------------------------------------- + + calc_hauptroutine_data_input(); // acquire current environment data + + calc_hauptroutine_update_tissues(); // update tissue pressures, also sets char_actual_ppO2 + + calc_CNS_fraction(); // calculate CNS% for the real tissues + + compute_CNS_for_display(); // compute integer copy of CNS value for display purpose + + calc_gradient_factor(); // compute current GF + + + //---- compute ppO2 warnings ------------------------------------------------------------------------------ + + // compute conditional min/max values + int_ppO2_min = (char_O_main_status & DECO_MODE_LOOP) ? (unsigned int)char_I_ppO2_min_loop : (unsigned int)char_I_ppO2_min; + int_ppO2_max = (char_O_deco_warnings & DECO_FLAG ) ? (unsigned int)char_I_ppO2_max_deco : (unsigned int)char_I_ppO2_max; + + // check for safe range of pure oxygen + if ( int_O_O2_ppO2 >= int_ppO2_max ) int_O_O2_ppO2 |= INT_FLAG_WARNING + INT_FLAG_HIGH; + + // check for safe range of breathed gas + if ( int_O_breathed_ppO2 <= int_ppO2_min ) int_O_breathed_ppO2 |= INT_FLAG_WARNING + INT_FLAG_LOW; + else if ( int_O_breathed_ppO2 >= int_ppO2_max ) int_O_breathed_ppO2 |= INT_FLAG_WARNING + INT_FLAG_HIGH; + else if ( int_O_breathed_ppO2 >= ppO2_prewarn_threshold ) int_O_breathed_ppO2 |= INT_FLAG_PREWARNING; + + // check for safe range of pure diluent + if ( int_O_pure_ppO2 <= (unsigned int)char_I_ppO2_min ) int_O_pure_ppO2 |= INT_FLAG_WARNING + INT_FLAG_LOW; + else if ( int_O_pure_ppO2 >= int_ppO2_max ) int_O_pure_ppO2 |= INT_FLAG_WARNING + INT_FLAG_HIGH; + + // check for safe range of calculated pSCR loop gas + if ( int_O_pSCR_ppO2 <= int_ppO2_min ) int_O_pSCR_ppO2 |= INT_FLAG_WARNING + INT_FLAG_LOW; + else if ( int_O_pSCR_ppO2 >= int_ppO2_max ) int_O_pSCR_ppO2 |= INT_FLAG_WARNING + INT_FLAG_HIGH; + + + //---- toggle between calculation for NDL (bottom time), deco stops and more deco stops (continue) ------ + + switch( char_O_deco_status & DECO_STATUS_MASK ) { - case 3: //---- At surface: start a new dive ------------------------------ - clear_deco_table(); + overlay unsigned char i; + + case DECO_STATUS_INIT: //---- At surface: start a new dive --------------------- + + clear_deco_table(); copy_deco_table(); - int_O_ascenttime = 0; // Reset DTR. - int_O_extra_ascenttime = 0; - char_O_nullzeit = 0; // Reset bottom time. - char_O_deco_status = 0; // Calc bottom-time/nullzeit next iteration. - + + + char_I_gas_change_time = 1; // TODO: validate proper operation before enabling this options-table parameter + + char_I_ascent_speed = 10; // TODO: validate proper operation before enabling this options-table parameter, + // caution: values < 10 may have an impact on the deco calculation run-times! + + + float_ascent_speed = 1.00 * char_I_ascent_speed; + float_desaturation_multiplier = 0.01 * char_I_desaturation_multiplier; + float_saturation_multiplier = 0.01 * char_I_saturation_multiplier; + float_deco_distance = 0.01 * char_I_deco_distance; + + int_O_ascenttime = 0; // reset ascent time in normal plan + int_O_alternate_ascenttime = 0; // reset ascent time in alternative plan + char_O_nullzeit = 0; // reset no decompression limit (NDL) in normal plan + char_O_alternate_nullzeit = 0; // reset no decompression limit (NDL) in alternative plan + char_O_deco_warnings = 0; // reset all deco warning flags + deco_tissue_vector = 0; // reset tissue deco vector + IBCD_tissue_vector = 0; // reset tissue IBCD vector + + int_O_desaturation_time = 65535; // tag desaturation time as invalid (it will not be computed during a dive) + + + for(i=0; i<NUM_GAS; ++i) + { + int_O_gas_volumes[i] = 0; + int_O_tank_pres_need[i] = 0 + INT_FLAG_ZERO; // 0 bar + flag for 0 bar + } + + for(i=0; i<NUM_COMP; ++i) + { + split_N2_He[i] = 90; // used for calculation of no-fly time + } + + + // init CNS counters + CNS_sim_norm_fraction = CNS_sim_alt_fraction = CNS_fraction; // the floats + int_O_normal_CNS_fraction = int_O_alternate_CNS_fraction = int_O_CNS_fraction; // the integers + + // Values that should be reset just once for the full real dive. // This is used to record the lowest stop for the whole dive, - // Including ACCROSS all simulated ascent. - low_depth = 0.0; - locked_GF_step = 0.0; - - // Reset gas switch history. - backup_gas_used = sim_gas_last_used = 0; - backup_gas_depth = sim_gas_last_depth = 0; - sim_dive_mins = 0; - break; - - case 0: //---- bottom time ----------------------------------------------- + // including ACCROSS all simulated ascents. + low_depth_norm = low_depth_alt = 0.0; + locked_GF_step_norm = locked_GF_step_alt = 0.0; + + + // continue in state DECO_STATUS_START to calculate the bottom-part of the dive and the NDL + char_O_deco_status &= ~DECO_STATUS_MASK; + + // code execution continues in state DECO_STATUS_START + + + case DECO_STATUS_START: //---- bottom time ------------------------------------- default: - gas_switch_find_current(); // Lookup for current gas & time. - gas_switch_set(); // setup calc_ratio's - + + // reread the GF settings in case there was a switch between GF/aGF + GF_low = char_I_GF_Low_percentage * 0.01; + GF_high = char_I_GF_High_percentage * 0.01; + GF_delta = GF_high - GF_low; + + // Lookup current gas and store it also as the first gas used. This gas will be used for the bottom + // segment of the dive and for the period of delayed ascent when calculating fTTS or bailout. + gas_find_current(); + + // setup the calculation ratio's calc_N2_ratio, calc_He_ratio and calc_O2_ratio + gas_switch_set(); + + // calculate ppN2 and ppHe from calc_N2_ratio & calc_He_ratio + sim_alveolar_presures(); + + // clear the internal(!) stops table + clear_deco_table(); + + // initialize the simulated tissues with the current state of the real tissues + update_startvalues(); + + // calculate the effect of extended bottom time due to delayed ascent / fTTS on current gas + if( char_O_deco_status & DECO_ASCENT_DELAYED ) sim_extra_time(); + + // calculate if we are within no decompression limit (NDL) calc_nullzeit(); - if( char_O_nullzeit > 0 ) // Some NDL time left ? - { - char_O_deco_status = 0; // YES: recalc ndl next time. - clear_deco_table(); // Also clear stops ! - copy_deco_table(); - char_O_deco_last_stop = 0; // And last stop (OSTC menu anim) - } - else - char_O_deco_status = 2; // NO: calc ascent next time. + + // check which plan we are on + if( char_O_deco_status & DECO_PLAN_ALTERNATE ) + { + //---- alternate dive plan -------------------------------------------------------------------- + + // Some NDL time left in alternate plan? + if( char_O_alternate_nullzeit > 0 ) + { + // clear tank pressure needs + if( char_O_deco_status & DECO_VOLUME_CALCULATE ) + for(i=0; i<NUM_GAS; ++i) int_O_tank_pres_need[i] = 0 + INT_FLAG_ZERO; // 0 bar + flag for 0 bar + + // calculate the CNS% at the end of the dive if requested: + // as we are in no stop, CNS at end of dive is more or less the same CNS we have now + if( char_O_deco_status & DECO_CNS_CALCULATE ) int_O_alternate_CNS_fraction = int_O_CNS_fraction; + + // clear fTTS ascent time + int_O_alternate_ascenttime = 0; + + // YES - computation of alternate plan completed + char_O_deco_status &= ~DECO_STATUS_MASK; + } + else + { + // NO - clear status bits and set status bits for + // calculation of ascent on next invocation + char_O_deco_status &= ~DECO_STATUS_MASK; + char_O_deco_status |= DECO_STATUS_ASCENT; + } + } + else + { + //---- normal dive plan ------------------------------------------------------------------------- + + // Some NDL time left in normal plan? + if( char_O_nullzeit > 0 ) + { + // published (erased) stops table + copy_deco_table(); + + // ** commented out - char_O_deco_last_stop is not used for anything + // + // // set last stop to 0 (for OSTC menu animation) + // char_O_deco_last_stop = 0; + + // clear tank pressure needs + if( char_O_deco_status & DECO_VOLUME_CALCULATE ) + for(i=0; i<NUM_GAS; ++i) int_O_tank_pres_need[i] = 0 + INT_FLAG_ZERO; // 0 bar + flag for 0 bar + + // calculate the CNS% at the end of the dive if requested: + // as we are in no stop, CNS at end of dive is more or less the same CNS we have now + if( char_O_deco_status & DECO_CNS_CALCULATE ) int_O_normal_CNS_fraction = int_O_CNS_fraction; + + // YES - computation of normal plan completed + char_O_deco_status &= ~DECO_STATUS_MASK; + } + else + { + // NO - clear status bits and set status bits for + // calculation of ascent on next invocation + char_O_deco_status &= ~DECO_STATUS_MASK; + char_O_deco_status |= DECO_STATUS_ASCENT; + } + } + + break; + + + case DECO_STATUS_ASCENT: //---- Simulate ascent to first stop ------------------- + + // initialize depth (in abs.pressure) for ascent and deco simulation, start from current real depth + temp_deco = pres_respiration; + + // calculate ascent to first stop + sim_ascent_to_first_stop(); + + // calculate all further stops next time + char_O_deco_status &= ~DECO_STATUS_MASK; // clear status bits and set status bits + char_O_deco_status |= DECO_STATUS_STOPS; // for calculation of stops on next invocation + break; - case 2: //---- Simulate ascent to first stop ----------------------------- - case 6: // @+5min variation - // Check proposed gas at begin of ascent simulation - sim_dive_mins = int_I_divemins; // Init current time. - - gas_switch_find_current(); // Lookup for current gas & time. - gas_switch_set(); // setup calc_ratio's - - backup_gas_used = sim_gas_last_used; // And save for later simu steps. - backup_gas_depth = sim_gas_last_depth; // And save for later simu steps. - - sim_ascent_to_first_stop(); - - // Calc stops next time (deco or gas switch). - char_O_deco_status = 1 | ( char_O_deco_status & 4 ); + + case DECO_STATUS_STOPS: //---- Simulate stops ---------------------------------- + + calc_hauptroutine_calc_deco(); + + // If simulation is finished, do some more computations if requested + // and restore the GF low reference so that the next ascent simulation + // is done from the current depth: + if( !(char_O_deco_status & DECO_STATUS_MASK) ) + { + // Calculate ascent time, result in int_O_ascenttime or int_O_alternate_ascenttime + calc_ascenttime(); + + // the current depth is needed by calc_CNS_planning() and gas_volumes() + bottom_depth = (unsigned char)((pres_respiration - pres_surface)*BAR_TO_METER); + + // if requested, calculate the CNS% at the end of the dive (including the deco stops) + if( char_O_deco_status & DECO_CNS_CALCULATE ) calc_CNS_planning(); + + // if requested, calculate the required gas volumes and tank pressures at the end of the dive. + if( char_O_deco_status & DECO_VOLUME_CALCULATE ) gas_volumes(); + + // some more aftermath dependent on the current plan + if( char_O_deco_status & DECO_PLAN_ALTERNATE ) + { + //---- alternative plan ---------------------------------------------------- + + // was CNS at end of dive calculated? + if( char_O_deco_status & DECO_CNS_CALCULATE ) + { + // yes - compute CNS value to display + if ( CNS_sim_alt_fraction < 0.01 ) int_O_alternate_CNS_fraction = 0; + else if ( CNS_sim_alt_fraction > 9.985 ) int_O_alternate_CNS_fraction = 999 + INT_FLAG_WARNING; + else + { + // convert float to integer + int_O_alternate_CNS_fraction = (unsigned short)(100 * CNS_sim_alt_fraction + 0.5); + + // set warning flag if CNS is >= 100% + if( int_O_alternate_CNS_fraction >= 100 ) + int_O_alternate_CNS_fraction |= INT_FLAG_WARNING; + + // set invalid flag if there is an overflow in the stops table + if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW ) + int_O_alternate_CNS_fraction |= INT_FLAG_INVALID; + } + } + else + { + // no - invalidate value (value = 0, invalid flag set) + int_O_alternate_CNS_fraction = INT_FLAG_INVALID; + } + } + else + { + //---- normal plan --------------------------------------------------------- + + // publish the stops table + copy_deco_table(); + + // was CNS at end of dive calculated? + if( char_O_deco_status & DECO_CNS_CALCULATE ) + { + // yes - compute CNS value to display + if ( CNS_sim_norm_fraction < 0.01 ) int_O_normal_CNS_fraction = 0; + else if ( CNS_sim_norm_fraction >= 9.985 ) int_O_normal_CNS_fraction = 999 + INT_FLAG_WARNING; + else + { + // convert float to integer + int_O_normal_CNS_fraction = (unsigned short)(100 * CNS_sim_norm_fraction + 0.5); + + // set warning flag if CNS is >= 100% + if( int_O_normal_CNS_fraction >= 100 ) + int_O_normal_CNS_fraction |= INT_FLAG_WARNING; + + // set invalid flag if there is an overflow in the stops table + if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW ) + int_O_normal_CNS_fraction |= INT_FLAG_INVALID; + } + } + else + { + // no - invalidate value (value = 0, invalid flag set) + int_O_normal_CNS_fraction = INT_FLAG_INVALID; + } + + } // aftermath + } // if + break; - - case 1: //---- Simulate stops -------------------------------------------- - case 5: // @+5 variation. - calc_hauptroutine_calc_deco(); - - // If simulation is finished, restore the GF low reference, so that - // next ascent simulation is done from the current depth: - if( (char_O_deco_status & 3) == 0 ) - { - sim_gas_last_used = backup_gas_used; - sim_gas_last_depth = backup_gas_depth; - } - break; - } + + } // switch } ////////////////////////////////////////////////////////////////////////////// @@ -1128,39 +1667,19 @@ // void calc_hauptroutine_data_input(void) { - overlay short int_temp; - overlay unsigned char g; - - pres_respiration = int_I_pres_respiration * 0.001; - pres_surface = int_I_pres_surface * 0.001; - N2_ratio = char_I_N2_ratio * 0.01; - He_ratio = char_I_He_ratio * 0.01; - float_deco_distance = char_I_deco_distance * 0.01; // Get offset in mbar - - // ____________________________________________________ - // - // _____________ G A S _ C H A N G E S ________________ - // ____________________________________________________ - - // Keep a margin of 150mbar = 1.50m - int_temp = (int_I_pres_respiration - int_I_pres_surface) - + MBAR_REACH_GASCHANGE_AUTO_CHANGE_OFF; - - // Gas are selectable if we did not pass the change depth by more than 1.50m: - for(g=0; g < NUM_GAS; ++g) - { - deco_gas_change[g] = 0; - if(char_I_deco_gas_change[g]) - if( int_temp > 100 *(short)char_I_deco_gas_change[g] ) - deco_gas_change[g] = char_I_deco_gas_change[g]; - } - - const_ppO2 = char_I_const_ppO2 * 0.01; - float_desaturation_multiplier = char_I_desaturation_multiplier * 0.01; - float_saturation_multiplier = char_I_saturation_multiplier * 0.01; - GF_low = char_I_GF_Low_percentage * 0.01; - GF_high = char_I_GF_High_percentage * 0.01; - GF_delta = GF_high - GF_low; + // get the current pressures + pres_respiration = 0.001 * int_I_pres_respiration; + pres_surface = 0.001 * int_I_pres_surface; + + // get the currently breathed gas mixture + O2_ratio = 0.01 * char_I_O2_ratio; + He_ratio = 0.01 * char_I_He_ratio; + + // N2 ratios are computed within p2_deco.c from the O2 and He ratios + N2_ratio = 1.0 - O2_ratio - He_ratio; + + // N2 tissue pressure at surface equilibrium, used for tissue graphics scaling + N2_equilibrium = 0.7902 * (pres_surface - ppWater); } ////////////////////////////////////////////////////////////////////////////// @@ -1168,29 +1687,138 @@ // void calc_hauptroutine_update_tissues(void) { + overlay float pres_diluent = pres_respiration; + + assert( 0.00 <= N2_ratio && N2_ratio <= 1.00 ); assert( 0.00 <= He_ratio && He_ratio <= 1.00 ); assert( (N2_ratio + He_ratio) <= 1.00 ); assert( 0.800 < pres_respiration && pres_respiration < 14.0 ); - pres_diluent = pres_respiration; - if( char_I_const_ppO2 != 0 ) + + //---- OC, CCR and Bailout Mode Gas Calculations ------------------------------------------------------------ + + // calculate ppO2 of pure oxygen + O2_ppO2 = (pres_respiration - ppWater); + + // capture failure condition in case pres_respiration is < ppWater (should never happen...) + if( O2_ppO2 < 0.0 ) O2_ppO2 = 0.0; + + // calculate ppO2 of the pure gas (diluent) + pure_ppO2 = O2_ppO2 * O2_ratio; + + + //---- PSCR Mode Gas Calculation----------------------------------------------------------- + + // With flags set for PSCR we compute the ppO2 in the loop from the diluent's O2 + // ratio and the PSCR parameters. This figure will be used in the pSCR custom view. + // If sensors are used (char_I_const_ppO2 > 0), we will override the calculated ppO2 + // with the sensor data. Then we continue with the CCR mode code which calculates + // the increase of ppN2 and ppH2 due to the reduction of the ppO2 in the loop. + // Essentially, diving a pSCR is like diving a CCR with a setpoint set lower than + // the ambient pressure multiplied with the O2 fraction of the diluent... + + // calculate pSCR ppO2 + // + // pres_respiration is 0.0 ... in bar + // O2_ratio is 0.0 ... 1.0 as factor + // char_I_PSCR_drop is 0 ... 15 as % + // char_I_PSCR_lungratio is 5 ... 20 as % + // pSCRppO2 is 0.0 ... in bar + + pSCR_ppO2 = (pres_respiration * O2_ratio) - (1 - O2_ratio) * 0.01 * char_I_PSCR_drop * char_I_PSCR_lungratio; + + // capture failure condition if case pSCR_ppO2 becomes negative + if( pSCR_ppO2 < 0.0 ) pSCR_ppO2 = 0.0; + + + //---- Loop modes : adjust ppN2 and ppHe for change in ppO2 due to setpoint (CCR) or drop (pSCR) ------------ + if ( char_O_main_status & DECO_MODE_LOOP ) { - overlay float flush_ppO2 = pres_respiration * (1.0 - N2_ratio - He_ratio); - + overlay float const_ppO2; + + // get the current sensor reading (CCR / pSCR if fitted) or the fixed setpoint (CCR) / a zero (pSCR) + const_ppO2 = 0.01 * char_I_const_ppO2; + + // Limit the setpoint to the maximum physically possible ppO2. This prevents for + // example calculating with a setpoint of 1.3 bar in only 2 meters of depth. + // Additionally, if limiting occurs, the ppO2 can be further reduced to account + // for residual inert gases by the user-adjustable setting char_I_cc_max_frac_o2. + + if( const_ppO2 > pres_respiration ) // no ppWater subtracted here to give some margin for + { // sensors delivering data a little bit over target + + const_ppO2 = 0.01 * char_I_cc_max_frac_o2 * (pres_respiration - ppWater); + } + + // check which kind of loop we are on + if( char_O_main_status & DECO_MODE_PSCR ) + { + //---- pSCR Mode -------------------------------------------------------------------------- + + // check if a sensor is fitted + if( char_I_const_ppO2 ) breathed_ppO2 = const_ppO2; // yes - derive ppO2s from (char_I_)const_ppO2 + else breathed_ppO2 = pSCR_ppO2; // no - derive ppO2s from calculated ppO2 + } + else + { + //---- CCR Mode --------------------------------------------------------------------------- + + // derive breathed ppO2 from (char_I_)const_ppO2, which holds sensor reading or fixed setpoint + breathed_ppO2 = const_ppO2; + } + + // adjust diluent pressure (ppN2 + ppHe) for change in ppO2 due to setpoint (CCR) or drop (pSCR) pres_diluent -= const_ppO2; - pres_diluent /= N2_ratio + He_ratio; // potential DIV/0 issue when O2 is used as diluent! - if( pres_diluent < 0.0 ) - pres_diluent = 0.0; - if(N2_ratio==0&He_ratio==0) pres_diluent = 0.0; // workaround for potential DIV/0 issue - - char_O_diluent = (unsigned char)(pres_diluent/pres_respiration*100.0 + 0.5); - - if( flush_ppO2 > 2.545) flush_ppO2 = 2.55; - if( flush_ppO2 < 0.0 ) flush_ppO2 = 0.0; - char_O_flush_ppO2 = (unsigned char)(flush_ppO2*100.0 + 0.5); - } - + pres_diluent /= N2_ratio + He_ratio; + + // capture all failure conditions, including div/0 in case diluent is pure O2 + if( (pres_diluent < 0.0) || (char_I_O2_ratio == 100) ) + { + pres_diluent = 0.0; + breathed_ppO2 = pure_ppO2; + } + + } + else + { //---- OC mode ----------------------------------------------------------------------------------------- + + // breathed ppO2 is ppO2 of pure gas + breathed_ppO2 = pure_ppO2; + } + + + // derive char_actual_ppO2 in [cbar], used for calculating CNS% + if ( breathed_ppO2 < 0.01 ) char_actual_ppO2 = 0; + else if ( breathed_ppO2 >= 2.545 ) char_actual_ppO2 = 255; + else char_actual_ppO2 = (unsigned char)(100 * breathed_ppO2 + 0.5); + + + //---- export ppO2 values in [cbar] for warning generation and display purpose ------------------------------ + + // pure oxygen ppO2 + if ( O2_ppO2 < 0.01 ) int_O_O2_ppO2 = 0; + else if ( O2_ppO2 >= 9.995 ) int_O_O2_ppO2 = 999; + else int_O_O2_ppO2 = (unsigned int)(100 * O2_ppO2 + 0.5); + + // pure gas ppO2 + if ( pure_ppO2 < 0.01 ) int_O_pure_ppO2 = 0; + else if ( pure_ppO2 >= 9.995 ) int_O_pure_ppO2 = 999; + else int_O_pure_ppO2 = (unsigned int)(100 * pure_ppO2 + 0.5); + + // calculated pSCR ppO2 + if ( pSCR_ppO2 < 0.01 ) int_O_pSCR_ppO2 = 0; + else if ( pSCR_ppO2 >= 9.995 ) int_O_pSCR_ppO2 = 999; + else int_O_pSCR_ppO2 = (unsigned int)(100 * pSCR_ppO2 + 0.5); + + // breathed ppO2 + if ( breathed_ppO2 < 0.01 ) int_O_breathed_ppO2 = 0; + else if ( breathed_ppO2 >= 9.995 ) int_O_breathed_ppO2 = 999; + else int_O_breathed_ppO2 = (unsigned int)(100 * breathed_ppO2 + 0.5); + + + //---- calculate ppN2, ppHe and EAD, END ------------------------------------------------------------------- + if( pres_diluent > ppWater ) { overlay float EAD, END; @@ -1198,48 +1826,71 @@ ppN2 = N2_ratio * (pres_diluent - ppWater); ppHe = He_ratio * (pres_diluent - ppWater); - // EAD : Equivalent Air Dive. Equivalent depth for the same N2 level - // with plain air. + // EAD : Equivalent Air Depth. Equivalent depth for the same N2 level with plain air. // ppN2 = 79% * (P_EAD - ppWater) // EAD = (P_EAD - Psurface) * 10 // ie: EAD = (ppN2 / 0.7902 + ppWater -Psurface) * 10 + EAD = (ppN2 / 0.7902 + ppWater - pres_surface) * BAR_TO_METER; - if( EAD < 0.0 || EAD > 245.5 ) EAD = 0.0; + + if( (EAD < 0.0) || (EAD > 245.5) ) EAD = 0.0; + char_O_EAD = (unsigned char)(EAD + 0.5); - // END : Equivalent Narcotic Dive. - // Here we count O2 as narcotic too. Hence everything but helium (has a narcosis factor of - // 0.23 btw). Hence the formula becomes: + + // END : Equivalent Narcotic Depth. + // Here we count O2 as narcotic too. Hence everything but helium (has a narcosis + // factor of 0.23 btw). Hence the formula becomes: // END * BarPerMeter * (1.0 - 0.0) - ppWater + Psurface == Pambient - ppHe - ppWater // ie: END = (Pambient - ppHe - Psurface) * BAR_TO_METER // // Source cited: // The Physiology and Medicine of Diving by Peter Bennett and David Elliott, // 4th edition, 1993, W.B.Saunders Company Ltd, London. + END = (pres_respiration - ppHe - pres_surface) * BAR_TO_METER; - if( END < 0.0 || END > 245.5 ) END = 0.0; - char_O_END = (unsigned char)(END + 0.5); + + if( (END < 0.0) || (END > 245.5) ) END = 0.0; + + char_O_END = (unsigned char)(END + 0.5); } - else // new in v.101 + else { - ppN2 = 0.0; - ppHe = 0.0; - char_O_EAD = char_O_END = 0; + ppN2 = ppHe = 0.0; + + char_O_EAD = char_O_END = 0; } - if(!char_I_step_is_1min) - calc_tissue(0); - else - calc_tissue(1); - - // Calc limit for surface, ie. GF_high. + + //---- calculate decompression status ---------------------------------------------------------------------- + + // Calculate tissues + calc_tissue(); + + // Calculate limit for surface, ie. GF_high. calc_limit(); - - // Fill int_O_ceiling if ceiling is below the surface - if ((calc_lead_tissue_limit-pres_surface)>0) - int_O_ceiling = (short)((calc_lead_tissue_limit-pres_surface)*1000); + + + // Fill int_O_ceiling (in mbar) if ceiling is below the surface + if( (calc_lead_tissue_limit - pres_surface) > 0 ) + { + +// compatibility version + int_O_ceiling = (short)((calc_lead_tissue_limit - pres_surface) * 1000); + +// new version +// // Round up to next 10 cm so that the ceiling disappears on the display only when the ceiling +// // limit is really zero. This will coincident then with TTS switching back to NDL time. +// int_O_ceiling = (short)((calc_lead_tissue_limit - pres_surface) * 1000 + 9); + + + // limit int_O_ceiling to 16000 mbar (150 m) + if( int_O_ceiling > 16000) int_O_ceiling = 16000; + } else + { int_O_ceiling = 0; + } int_O_gtissue_press = (short)((pres_tissue_N2[char_O_gtissue_no] + pres_tissue_He[char_O_gtissue_no]) * 1000); } @@ -1249,154 +1900,209 @@ // Compute stops. // // Note: because this can be very long, break on 16 iterations, and set state -// to 0 when finished, or to 1 when needing to continue. +// to DECO_STATUS_FINISHED when finished, or to DECO_STATUS_STOPS when +// needing to continue. // Note: because each iteration might be very long too (~ 66 ms in 1.84beta), -// break the loop when total time > 512msec. +// break the loop when elapsed time exceeds 512 milliseconds. // void calc_hauptroutine_calc_deco(void) { - overlay unsigned char loop; - - for(loop = 0; loop < 16; ++loop) - { - // Limit loops to 512ms, using timer 5: - if( tmr5() & (512*32) ) - break; - - if( calc_nextdecodepth() ) - { - if( temp_depth_limit == 0 ) - goto Surface; - - //---- We hit a stop at temp_depth_limit --------------------- - temp_deco = temp_depth_limit * METER_TO_BAR // Convert to relative bar, - + pres_surface; // To absolute. - if( !update_deco_table() ) // Adds a one minute stops. - goto Surface; // Deco table full: abort... - } - else - { - //---- No stop ----------------------------------------------- - temp_deco -= (10*METER_TO_BAR); // Ascend 10m, no wait. - - //---- Finish computations once surface is reached ----------- - if( temp_deco <= pres_surface ) - { + overlay unsigned char loop; + + for(loop = 0; loop < 16; ++loop) + { + // limit loops to 512ms, using timer 5 + if( tmr5() & (512*32) ) break; + + // calc_nextdecodepth() + // + // INPUT temp_deco : current depth in absolute pressure + // OUTPUT temp_depth_limit : depth of next stop in meters + // RETURN true if a stop is needed + // + // The function manages gas changes by itself, including priming + // the deco stop with the configured gas change time. + // + if( calc_nextdecodepth() ) + { + if( temp_depth_limit == 0 ) goto Surface; // this check should not bee needed as in + // this case the RETURN value will be false + + //---- stop required at temp_depth_limit ------------------------------------- + + // convert stop depth in meters to absolute pressure + temp_deco = temp_depth_limit * METER_TO_BAR + pres_surface; + + // add one minute to the current stop, or add a new stop, + // or abort deco calculation if the deco table is full. + if( !update_deco_table(1) ) goto Surface; + } + else + { + //---- no stop required -------------------------------------- + + // ascend by float_ascent_speed for 1 minute + temp_deco -= float_ascent_speed * METER_TO_BAR; + + // finish deco calculation if surface is reached + if( temp_deco <= pres_surface ) + { Surface: - if( char_O_deco_status == 1 ) // Don't in @+5min variant. - copy_deco_table(); - - calc_ascenttime(); - char_O_deco_status = 0; // calc nullzeit next time. - char_O_deco_last_stop = 0; // Surface reached (to animate menu) - return; - } - } - //---- Then update tissue -------------------------------------------- - sim_dive_mins++; // Advance simulated time by 1 minute. - gas_switch_set(); // Apply any simulated gas change, once validated. - sim_alveolar_presures(); // Updates ppN2 and ppHe. - sim_tissue(1); // Simulate compartiments for 1 minute. - } - - // Surface not reached, need more stops... for menu animation. - char_O_deco_last_stop = temp_depth_limit; // Reached depth. + // set deco engine status to done (DECO_STATUS_FINISHED) + char_O_deco_status &= ~DECO_STATUS_MASK; + + // ** commented out - char_O_deco_last_stop is not used for anything + // + // // surface reached (to animate menu) + // if( !(char_O_deco_status & DECO_PLAN_ALTERNATE)) char_O_deco_last_stop = 0; + + return; + } + } + + + //---- as one minute as passed now, update the tissues ---------------------- + + // program 1 minute interval on simulated tissues (Flagbit 7 = 0) + tissue_increment = 1; + + // compute current ppN2 and ppHe + sim_alveolar_presures(); + + // update the tissues + calc_tissue(); + } + + // ** commented out - char_O_deco_last_stop is not used for anything + // + // // surface not reached, need more stops... store reached depth for menu animation. + // if( !(char_O_deco_status & DECO_PLAN_ALTERNATE) ) char_O_deco_last_stop = temp_depth_limit; } ////////////////////////////////////////////////////////////////////////////// -// Simulation ascention to first deco stop. +// Simulate ascent to first deco stop. // -// Note: because we ascent with a constant speed (10m/mn, ie. 1bar/mn), -// there is no need to break on more that 16 iterations -// (or we are already in deep shit). // -// Input: pres_respiration -// Output: temp_deco +// Modified: temp_deco : current depth in ascent and deco simulation, in bar absolute pressure // -// if char_O_deco_status indicate @+5 variant, add extra time at current depth, -// before ascent. void sim_ascent_to_first_stop(void) { - overlay unsigned char fast = 1; // 1min or 2sec steps. - - update_startvalues(); - clear_deco_table(); - - temp_deco = pres_respiration; // Starts from current real depth. - - // Are we doing the special @+5min variation ? - if(char_O_deco_status & 4) - sim_extra_time(); - - //---- Loop until first stop, gas switch, or surface is reached ---------- - for(;;) - { - overlay float old_deco = temp_deco; // Pamb backup (bars) - - // Try ascending 1 full minute (fast) or 2sec (!fast): - if( fast ) - temp_deco -= 10*METER_TO_BAR; // 1 min, at 10m/min. ~ 1bar. - else - temp_deco -= (10.0/30.0)*METER_TO_BAR; // 2sec at 10m/min. - - if( temp_deco < pres_surface ) // But don't go over surface. - temp_deco = pres_surface; - - // Recompute sim_lead_tissue_limit at GF_low (deepest stop), because - // one minute passed. - sim_limit(GF_low); - - // Did we reach deepest remaining stop ? - if( temp_deco < sim_lead_tissue_limit ) - { - temp_deco = old_deco; // Restore last correct depth, - - if( fast ) - { - fast = 0; // Retry with 2sec steps. - continue; - } - else - break; // Done... - } - - // Did we reach surface ? - // NOTE: we should round BEFORE checking surface is reached. - temp_depth_limit = (unsigned char)(0.5 + (temp_deco - pres_surface) * BAR_TO_METER); - if( temp_depth_limit == 0 ) - { - temp_deco = pres_surface; // Yes: finished ! - break; - } - - // Check for gas change below new depth ? - if( gas_switch_deepest() ) - { - assert( temp_depth_limit > 0); - - temp_deco = temp_depth_limit * METER_TO_BAR + pres_surface; - break; - } - - if( fast ) - sim_dive_mins++; // Advance simulated time by 1 minute. - sim_alveolar_presures(); // temp_deco --> ppN2/ppHe - sim_tissue(fast); // and update tissues for 1 min. - } + overlay unsigned char fast = 1; // 1 = 1 minute steps, 0 = 2 seconds steps + overlay unsigned char gaschange = 0; // 1 = do a gas change, 0 = no better gas available + + + //---- Loop until first deco stop or surface is reached ---------- + for(;;) + { + // depth in absolute pressure we came from + overlay float old_deco = temp_deco; + + // try ascending 1 full minute (fast) or 2 seconds (!fast) + if ( fast ) temp_deco -= float_ascent_speed * METER_TO_BAR; // 1 min at float_ascent_speed ( 5 .. 10 m/min) + else temp_deco -= (float_ascent_speed/30.0) * METER_TO_BAR; // 2 sec at float_ascent_speed (17 .. 33 cm/min) + + // but don't go over surface + if( temp_deco < pres_surface ) temp_deco = pres_surface; + + // compute sim_lead_tissue_limit + if ( char_I_deco_model != 0 ) sim_limit(GF_low); + else sim_limit(1.0); + + // did we overshoot the first deco stop? + if( temp_deco < sim_lead_tissue_limit ) + { + // YES - back to last depth below first stop + temp_deco = old_deco; + + // switch to 2 seconds ascent if not yet in, else done + if( fast ) + { + fast = 0; // retry with 2 seconds ascent steps + continue; + } + else + { + break; // done... + } + } + + // If code execution passes along here, we did not overshoot the first stop. + + // did we reach the surface? if yes, done! + if( temp_deco == pres_surface ) break; + + // depth in meters where we are now (no round-up) + temp_depth_limit = (unsigned char)((temp_deco - pres_surface) * BAR_TO_METER); + + // Check if there is a better gas to switch to, but only in alternative plan mode + // or if override is set. If yes, introduce a stop for the gas change. + if( ((char_O_deco_status & DECO_PLAN_ALTERNATE) || (char_O_main_status & DECO_GASCHANGE_OVRD)) + && gas_find_better() ) + { + // depth in meters we came from + overlay unsigned char old_depth_limit = (unsigned char)((old_deco - pres_surface) * BAR_TO_METER); + + // adjust temp_depth_limit to the gas change depth, but not deeper than the depth we came from + temp_depth_limit = (sim_gas_last_depth < old_depth_limit) ? sim_gas_last_depth : old_depth_limit; + + // create a stop for the gas change + update_deco_table(char_I_gas_change_time); + + // set the new calculation values for N2, He and O2 + gas_switch_set(); + + // signal to create a stop for the gas change and update the tissues + gaschange = char_I_gas_change_time; + + // Adjust the depth for the tissue update to the stop depth. In case of fast mode, this + // imposes that the ascent from the 'old_deco' depth to this stop took 1 minute although + // we might have only ascended one or two meters... + temp_deco = temp_depth_limit * METER_TO_BAR + pres_surface; + } + + // Did one minute pass by and/or do we have a gas change? + // Remark: The 2 seconds ascent iterations towards the first deco stop in !fast speed may take + // up to 28 seconds in total - for this rough half of a minute no tissue updates will be computed. + // Well, it could be done by setting tissue_increment = 0 in !fast condition and making calls to + // sim_alveolar_presures() and calc_tissue() - see code commented out below. + if( fast || gaschange ) + { + // program interval on simulated tissues (flag bit 7 = 0) + tissue_increment = fast + gaschange; + + // clear gas change signal + gaschange = 0; + // } + // else + // { + // // program 2 seconds interval on simulated tissues (flag bit 7 = 0) + // tissue_increment = 0; + // } + // { + // compute ppN2/ppHe for current depth from temp_deco + sim_alveolar_presures(); + + // update the tissues + calc_tissue(); + } + } } ////////////////////////////////////////////////////////////////////////////// -// Simulation extra time at the current depth. +// Simulate extra time at the current depth. // -// This routine is used for @+5min feature. +// This routine is used for the futureTTS / delayed ascent feature. +// void sim_extra_time(void) { - overlay unsigned char extra = char_I_extra_time; - do { - sim_dive_mins++; // Advance simulated time by 1 minute. - sim_tissue(1); // and update tissues for 1 min. - } while( --extra != 0 ); + overlay unsigned char backup = tissue_increment; // back-up tissue_increment + + tissue_increment = char_I_extra_time; // program interval on simulated tissues (Flagbit 7 = 0) + + calc_tissue(); // update the tissues + + tissue_increment = backup; // restore tissue_increment } ////////////////////////////////////////////////////////////////////////////// @@ -1404,25 +2110,175 @@ // // optimized in v.101 // -static void calc_tissue(PARAMETER unsigned char period) +// INPUT: ppN2, ppHe, tissue_increment +// MODIFIED: pres_tissue_N2[], pres_tissue_He[] +// OUTPUT: char_O_tissue_N2_saturation[], char_O_tissue_He_saturation[] +// +static void calc_tissue() { + overlay float temp_tissue_N2; + overlay float temp_tissue_He; + overlay unsigned char period; + overlay unsigned char i; + + assert( 0.00 <= ppN2 && ppN2 < 11.2 ); // 80% N2 at 130m assert( 0.00 <= ppHe && ppHe < 12.6 ); // 90% He at 130m - - for (ci=0;ci<NUM_COMP;ci++) + + + for (ci=0;ci<NUM_COMP;ci++) // iterate through all compartments { - read_buhlmann_times(period); // 2 sec or 1 min period. - - // N2 - temp_tissue = (ppN2 - pres_tissue_N2[ci]) * var_N2_e; - temp_tissue_safety(); - pres_tissue_N2[ci] += temp_tissue; - - // He - temp_tissue = (ppHe - pres_tissue_He[ci]) * var_He_e; - temp_tissue_safety(); - pres_tissue_He[ci] += temp_tissue; - } + i = tissue_increment & 127; // extract number of minutes to do (if i > 0) + // or if one 2 second period is to do (if i = 0) + + if( i == 0 ) // check if we shall do one 2-seconds period + { + read_Buhlmann_times(0); // YES, program coefficients for a 2 seconds period + period = 1; // set period length (in cycles) + i = 1; // and one cycle to do + } + else if( i > 9 ) // check if we can start with 10 minutes periods + { + read_Buhlmann_times(2); // YES, program coefficients for 10 minutes periods + period = 10; // set period length (in cycles) to ten + } + else // we shall do 1 to 9 minutes + { + read_Buhlmann_times(1); // program coefficients for 1 minute periods + period = 1; // set period length (in cycles) to one + } + + do + { + //---- N2 ------------------------------------------------------------------------------- + + temp_tissue = (tissue_increment & 128) ? pres_tissue_N2[ci] : sim_pres_tissue_N2[ci]; + + temp_tissue = (ppN2 - temp_tissue) * var_N2_e; + + temp_tissue_safety(); + + if( tissue_increment & 128 ) + { + // The temp variable takes on purpose just the tissue increment from the last loop's iteration. + temp_tissue_N2 = temp_tissue; + + // Update the real tissues if either we are on the 2 seconds interval, + // or if we shall advance the tissues on a one or several minutes basis. + if( twosectimer || (tissue_increment & 127) ) pres_tissue_N2[ci] += temp_tissue; + } + else + { + // Updates of the sim-tissues always comes on a 1 minutes basis, + // so we do not need to check of the 2 seconds interval. + sim_pres_tissue_N2[ci] += temp_tissue; + } + + + //---- He ------------------------------------------------------------------------------- + + temp_tissue = (tissue_increment & 128) ? pres_tissue_He[ci] : sim_pres_tissue_He[ci]; + + temp_tissue = (ppHe - temp_tissue) * var_He_e; + + temp_tissue_safety(); + + if( tissue_increment & 128 ) + { + // The temp variable takes on purpose just the tissue increment from the last loop's iteration. + temp_tissue_He = temp_tissue; + + // Update the real tissues if either we are on the 2 seconds interval, + // or if we shall advance the tissues on a one or several minutes basis. + if( twosectimer || (tissue_increment & 127) ) pres_tissue_He[ci] += temp_tissue; + + } + else + { + // Updates of the sim-tissues always comes on a 1 minutes basis, + // so we do not need to check of the 2 seconds interval. + sim_pres_tissue_He[ci] += temp_tissue; + } + + + // decrement loop counter + i -= period; + + // check if we need to switch from 10 minute periods to 1 minute periods + if( (i > 0) && (period = 10) && (i < 10) ) + { + read_Buhlmann_times(1); // program coefficients for 1 minute periods + period = 1; // set period length (in cycles) to one + } + } + while( i ); + + + // have the computations been done for the "real" tissues? + if( (tissue_increment & 128) && (twosectimer || (tissue_increment & 127)) ) + { + // net tissue balance + temp_tissue = temp_tissue_N2 + temp_tissue_He; + + // check tissue on-/off-gassing and IBCD with applying a threshold of +/-HYST + // + if ( temp_tissue < -HYST ) // Check if the tissue is off-gassing + { + deco_tissue_vector |= (1 << ci); // tag tissue as being in decompression + IBCD_tissue_vector &= ~(1 << ci); // tag tissue as not experiencing mentionable IBCD + } + else if ( temp_tissue > +HYST ) // check if the tissue in on-gassing + { + deco_tissue_vector &= ~(1 << ci); // tag tissue as not being in decompression + + if( ((temp_tissue_N2 > 0.0) && (temp_tissue_He < 0.0)) // check for counter diffusion + || ((temp_tissue_N2 < 0.0) && (temp_tissue_He > 0.0)) ) + { + IBCD_tissue_vector |= (1 << ci); // tag tissue as experiencing mentionable IBCD + } + } + + + // keep the saturating / desaturating flags from last invocation + char_O_tissue_N2_saturation[ci] &= 128; + char_O_tissue_He_saturation[ci] &= 128; + + // flip the flags applying a hysteresis of HYST (actual value: see #define of HYST) + if( temp_tissue_N2 > +HYST ) char_O_tissue_N2_saturation[ci] = 128; // set flag for tissue pressure is increasing + else if( temp_tissue_N2 < -HYST ) char_O_tissue_N2_saturation[ci] = 0; // clear flag (-> tissue pressure is decreasing) + + if( temp_tissue_He > +HYST ) char_O_tissue_He_saturation[ci] = 128; // set flag for tissue pressure is increasing + else if( temp_tissue_He < -HYST ) char_O_tissue_He_saturation[ci] = 0; // clear flag (-> tissue pressure is decreasing) + + + // For N2 tissue display purpose: + // Scale tissue press so that saturation in 70m on AIR gives a value of approx. 80. + // The surface steady-state tissue loading of [0.7902 * (pres_respiration - ppWater)] bar + // gives then a 10. If N2 is completely washed out of the tissue, result will be 0. + // This scaling is adapted to the capabilities of the tissue graphics in the custom views. + temp_tissue = (pres_tissue_N2[ci] / N2_equilibrium) * 10; + + // limit to 127 to leave space for sat/desat flag + if (temp_tissue > 127) temp_tissue = 127; + + // export as integer + char_O_tissue_N2_saturation[ci] += (unsigned char)temp_tissue; + + + // For H2 tissue display purpose: + // Scale tissue press so that saturation in 120m on TMX 10/70 gives a value of approx. 70. + // With no He in a tissue, result will be 0. + // This scaling is adapted to the capabilities of the tissue graphics in the custom views. + temp_tissue = pres_tissue_He[ci] * 7.7; + + // limit to 127 to leave space for sat/desat flag + if (temp_tissue > 127) temp_tissue = 127; + + // export as integer + char_O_tissue_He_saturation[ci] += (unsigned char)temp_tissue; + } + + }// for } ////////////////////////////////////////////////////////////////////////////// @@ -1432,41 +2288,99 @@ // static void calc_limit(void) { - char_O_gtissue_no = 0; // BUGFIX, changed from 255 to 0 to have a valid leading tissue number defined at any times - calc_lead_tissue_limit = 0.0; - - for(ci=0; ci<NUM_COMP;ci++) + char_O_gtissue_no = 0; + calc_lead_tissue_limit = 0.0; + + // clear IBCD, microbubbles and outside warning flags (locked warnings will be preserved) + char_O_deco_warnings &= ~(DECO_WARNING_IBCD + DECO_WARNING_MBUBBLES + DECO_WARNING_OUTSIDE); + + + for(ci=0; ci<NUM_COMP; ci++) { overlay float N2 = pres_tissue_N2[ci]; overlay float He = pres_tissue_He[ci]; - overlay float p = N2 + He; - - read_buhlmann_coefficients(); - var_N2_a = (var_N2_a * N2 + var_He_a * He) / p; - var_N2_b = (var_N2_b * N2 + var_He_b * He) / p; - - // Apply the Eric Baker's varying gradient factor correction. + overlay float pres_tissue = N2 + He; + overlay float pres_min; + overlay float gf; + overlay float threshold; + + read_Buhlmann_coefficients(); + var_N2_a = (var_N2_a * N2 + var_He_a * He) / pres_tissue; + var_N2_b = (var_N2_b * N2 + var_He_b * He) / pres_tissue; + + // calculate minimum ambient pressure that the tissue can withstand according to straight Buhlmann + pres_min = (pres_tissue - var_N2_a) * var_N2_b; + + // calculate current gf value (1.0 = 100%) of this tissue + gf = (pres_tissue - pres_respiration) / (pres_tissue - pres_min); + if( gf < 0.0 ) gf = 0.0; + + // calculate a threshold value for use below + // ToDo: finalize the definition of the threshold + threshold = 0.02 * ci + 0.9; + + // check if this tissue is likely to develop microbubbles + // and/or if this tissue is outside the Buhlmann model + if( ci <= 5 ) + { + if( gf >= threshold ) + { + char_O_deco_warnings |= (DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock); + + if( gf >= 1.0 ) + { + char_O_deco_warnings |= (DECO_WARNING_OUTSIDE + DECO_WARNING_OUTSIDE_lock); + } + } + } + else + { + if( gf >= 1.0 ) + { + char_O_deco_warnings |= (DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock); + + if( gf >= threshold ) + { + char_O_deco_warnings |= (DECO_WARNING_OUTSIDE + DECO_WARNING_OUTSIDE_lock); + } + } + } + + + // Apply the Eric Baker's varying gradient factor correction if the GF-Model is selected. // Note: the correction factor depends both on GF and b, // Actual values are in the 1.5 .. 1.0 range (for a GF=30%), // so that can change who is the leading gas... - // Note: Also depends of the GF. So the calcul is different for - // GF_low, current GF, or GF_high... - // *BUT* calc_tissue() is used to compute bottom time, - // hence what would happend at surface, + // Note: Also depends of the GF. So the calculus is different for GF_low, current GF, or GF_high... + // *BUT* calc_tissue() is used to compute bottom time, hence what would happen at surface, // hence at GF_high. - if( char_I_deco_model != 0 ) - p = ( p - var_N2_a * GF_high) * var_N2_b - / (GF_high + var_N2_b * (1.0 - GF_high)); - else - p = (p - var_N2_a) * var_N2_b; - if( p < 0.0 ) p = 0.0; - - if( p > calc_lead_tissue_limit ) + if( char_I_deco_model != 0 ) pres_min = ( pres_tissue - var_N2_a * ( GF_high) ) * var_N2_b + / ( GF_high + var_N2_b * (1.0 - GF_high) ); + + // check if this tissue requires a higher ambient pressure than was found to be needed up to now + if( pres_min > calc_lead_tissue_limit ) { - char_O_gtissue_no = ci; - calc_lead_tissue_limit = p; + char_O_gtissue_no = ci; + calc_lead_tissue_limit = pres_min; } } + + // check IBCD condition + if( !IBCD_tissue_vector ) + { + char_O_deco_warnings &= ~DECO_WARNING_IBCD; // no IBCD in any tissue, clear flag + } + else if( (IBCD_tissue_vector & (1 << char_O_gtissue_no)) + && ((pres_tissue_N2[char_O_gtissue_no] + pres_tissue_He[char_O_gtissue_no]) > pres_respiration) ) + { + // leading tissue is in IBCD condition and in super-saturation, set flags. + char_O_deco_warnings |= (DECO_WARNING_IBCD + DECO_WARNING_IBCD_lock); + } + + // check if is any tissue off-gassing + if (deco_tissue_vector) char_O_deco_warnings |= DECO_FLAG; // yes, set deco flag + else char_O_deco_warnings &= ~DECO_FLAG; // no, clear deco flag + assert( char_O_gtissue_no < NUM_COMP ); assert( 0.0 <= calc_lead_tissue_limit && calc_lead_tissue_limit <= 14.0); @@ -1482,53 +2396,57 @@ // invert... So we have to make a fast-simu until we find a better way. // // Input: pres_respiration -// Output: char_O_nullzeit +// Output: char_O_nullzeit / char_O_alternate_nullzeit // static void calc_nullzeit(void) { + overlay unsigned char nullzeit = 240; + + //---- Compute ppN2 and ppHe --------------------------------------------- temp_deco = pres_respiration; sim_alveolar_presures(); - - char_O_nullzeit = 240; + for(ci=0; ci<NUM_COMP; ci++) { //---- Read A/B values and loading factor for N2 and He -------------- - overlay float tN2 = pres_tissue_N2[ci]; - overlay float tHe = pres_tissue_He[ci]; + + overlay float tN2 = sim_pres_tissue_N2[ci]; + overlay float tHe = sim_pres_tissue_He[ci]; + overlay float t = tN2 + tHe; overlay unsigned char ndl; overlay unsigned char period = 10; - read_buhlmann_coefficients(); - read_buhlmann_times(2); // Starts with a 10min period. + read_Buhlmann_coefficients(); + read_Buhlmann_times(2); // Starts with a 10min period. //---- Simulate for that tissue -------------------------------------- - // NOTE: No need to simulate for longuer than the already found NDL. - for(ndl=0; ndl<char_O_nullzeit;) + // NOTE: No need to simulate for longer than the already found NDL. + for(ndl=0; ndl<nullzeit;) { - //---- Compute updated mix M-value at surface - overlay float a = (var_N2_a * tN2 + var_He_a * tHe) / t; - overlay float b = (var_N2_b * tN2 + var_He_b * tHe) / t; - overlay float M0 = (a + pres_surface/b); - - //---- Add 10min/1min to N2/He tissues - overlay float dTN2 = (ppN2 - tN2) * var_N2_e; - overlay float dTHe = (ppHe - tHe) * var_He_e; - - //---- Apply security margin for both models - // NDL can be computed while ascending... SO we have - // to check wether we are saturating or desaturating. - if( dTN2 > 0.0 ) dTN2 *= float_saturation_multiplier; - else dTN2 *= float_desaturation_multiplier; - - if( dTHe > 0.0 ) dTHe *= float_saturation_multiplier; - else dTHe *= float_saturation_multiplier; - - if (char_I_deco_model != 0 ) - M0 = GF_high * (M0 - pres_surface) + pres_surface; - - //---- Simulate off-gasing while going to surface + //---- Compute updated mix M-value at surface + overlay float a = (var_N2_a * tN2 + var_He_a * tHe) / t; + overlay float b = (var_N2_b * tN2 + var_He_b * tHe) / t; + overlay float M0 = (a + pres_surface/b); + + //---- Add 10min/1min to N2/He tissues + overlay float dTN2 = (ppN2 - tN2) * var_N2_e; + overlay float dTHe = (ppHe - tHe) * var_He_e; + + //---- Apply safety margin for both models + // NDL can be computed while ascending... SO we have + // to check if we are saturating or desaturating. + if( dTN2 > 0.0 ) dTN2 *= float_saturation_multiplier; + else dTN2 *= float_desaturation_multiplier; + + if( dTHe > 0.0 ) dTHe *= float_saturation_multiplier; + else dTHe *= float_saturation_multiplier; + + // adopt M0 value when using the GF extension + if (char_I_deco_model != 0 ) M0 = GF_high * (M0 - pres_surface) + pres_surface; + + //---- Simulate off-gassing while going to surface // TODO ! // dTN2 -= exp( ... ascent time ... ppN2...) // dTHe -= exp( ... ascent time ... ppHe...) @@ -1536,61 +2454,95 @@ //---- Ok now, and still ok to surface after 1 or 10 minutes ? if( (t <= M0) && (t + dTN2 + dTHe <= M0) ) { - tN2 += dTN2; // YES: apply gas loadings, + tN2 += dTN2; // YES: apply gas loadings, tHe += dTHe; - t = tN2 + tHe; - ndl += period; // increment NDL, - continue; // and loop. + t = tN2 + tHe; + + ndl += period; // increment NDL, + + continue; // and loop. } //---- Should we retry with smaller steps ? if( period == 10 ) { - read_buhlmann_times(1); // 1min coefs. + read_Buhlmann_times(1); // 1min coefs. period = 1; + continue; } //---- ELSE make a linear approx for the last minute - // Usefull to have a meaningfull rounding of NDL. - // But ONLY it positive (negativ casted to unsigned is bad). - if( M0 > t ) - ndl += (unsigned char)(0.5f + (M0-t)/(dTN2+dTHe)); + // Useful to have a meaningful rounding of NDL. + // But ONLY if positive (negative casted to unsigned is bad). + if( M0 > t ) ndl += (unsigned char)(0.5f + (M0-t)/(dTN2+dTHe)); + break; } // Keep the shortest NDL found - if( ndl < char_O_nullzeit ) - char_O_nullzeit = ndl; + if ( ndl < nullzeit ) nullzeit = ndl; } + + if( char_O_deco_status & DECO_PLAN_ALTERNATE) char_O_alternate_nullzeit = nullzeit; + else char_O_nullzeit = nullzeit; } ////////////////////////////////////////////////////////////////////////////// // calc_ascenttime // -// Summup ascent from bottom to surface, at 1 bar/min, 1min for last 3 meters, -// and all stops. +// Sum up ascent from bottom to surface at float_ascent_speed, +// but 1 minute per meter for the final ascent, and all stops. // -// Result in int_O_ascenttime, or int_O_extra_ascenttime if in @+5min variant. +// Result in int_O_ascenttime, +// or int_O_alternate_ascenttime if doing the alternative plan. +// static void calc_ascenttime(void) { - overlay unsigned char x; + overlay unsigned char x; overlay unsigned short sum; - - // + 0.7 to count 1 minute ascent time from 3 metre to surface - overlay float ascent = pres_respiration - pres_surface + 0.7; - if (ascent < 0.0) - ascent = 0.0; - sum = (unsigned short)(ascent + 0.99); - + + // preset final ascent + overlay float final = (float)char_I_depth_last_deco; + + // calculate depth + overlay float ascent = (pres_respiration - pres_surface) * BAR_TO_METER; + + // check if we are already in final ascent + if (ascent <= final) + { + // yes - all ascent is final ascent + final = ascent; + ascent = 0.0; + } + else + { + // no - subtract final ascent part from overall ascent + ascent -= final; + + // compute time for ascent part without final ascent + ascent /= float_ascent_speed; + } + + // add 1 minute for each meter of final ascent + ascent += final; + + // convert to integer + sum = (unsigned short)(ascent + 0.5); + + // add all stop times for(x=0; x<NUM_STOPS && internal_deco_depth[x]; x++) sum += (unsigned short)internal_deco_time[x]; - if( char_O_deco_status == 1 ) - int_O_ascenttime = sum; - else - int_O_extra_ascenttime = sum; - + // limit result to display max. + if( sum > 999) sum = 999; + + // tag result as invalid if there is an overflow in the stops table + if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW ) sum |= INT_FLAG_INVALID; + + // route result to output variable + if( char_O_deco_status & DECO_PLAN_ALTERNATE ) int_O_alternate_ascenttime = sum; + else int_O_ascenttime = sum; } ////////////////////////////////////////////////////////////////////////////// @@ -1611,36 +2563,7 @@ // No leading tissue (yet) for this ascent simulation. sim_lead_tissue_limit = 0.0; - sim_lead_tissue_no = 255; -} - -////////////////////////////////////////////////////////////////////////////// -// sim_tissue -// -// optimized in v.101 -// -// Function very simular to calc_tissue, but: -// + Use a 1min or 10min period. -// + Do it on sim_pres_tissue, instead of pres_tissue. -static void sim_tissue(PARAMETER unsigned char period) -{ - assert( 0.00 <= ppN2 && ppN2 < 11.2 ); // 80% N2 at 130m - assert( 0.00 <= ppHe && ppHe < 12.6 ); // 90% He at 130m - - for(ci=0; ci<NUM_COMP; ci++) - { - read_buhlmann_times(period); // 1 or 10 minute(s) interval - - // N2 - temp_tissue = (ppN2 - sim_pres_tissue_N2[ci]) * var_N2_e; - temp_tissue_safety(); - sim_pres_tissue_N2[ci] += temp_tissue; - - // He - temp_tissue = (ppHe - sim_pres_tissue_He[ci]) * var_He_e; - temp_tissue_safety(); - sim_pres_tissue_He[ci] += temp_tissue; - } + sim_lead_tissue_no = 1; } ////////////////////////////////////////////////////////////////////////////// @@ -1648,15 +2571,15 @@ // // New in v.111 // -// Function separated from sim_tissue() to allow recomputing limit on +// Function separated from calc_tissue() to allow recomputing limit on // different depth, because it depends on current gradient factor. // static void sim_limit(PARAMETER float GF_current) { - assert( 0.0 < GF_current && GF_current <= 1.0f); + assert( 0.0 < GF_current && GF_current <= 1.0 ); sim_lead_tissue_limit = 0.0; - sim_lead_tissue_no = 0; // If no one is critic, keep first tissue. + sim_lead_tissue_no = 0; // If no one is critic, keep first tissue. for(ci=0; ci<NUM_COMP; ci++) { @@ -1664,7 +2587,7 @@ overlay float He = sim_pres_tissue_He[ci]; overlay float p = N2 + He; - read_buhlmann_coefficients(); + read_Buhlmann_coefficients(); var_N2_a = (var_N2_a * N2 + var_He_a * He) / p; var_N2_b = (var_N2_b * N2 + var_He_b * He) / p; @@ -1673,15 +2596,15 @@ // Actual values are in the 1.5 .. 1.0 range (for a GF=30%), // so that can change who is the leading gas... // Note: Also depends of the GF_current... - if( char_I_deco_model != 0 ) - p = ( p - var_N2_a * GF_current) - / (GF_current / var_N2_b + 1.0 - GF_current); - else - p = (p - var_N2_a) * var_N2_b; + if( char_I_deco_model != 0 ) p = ( p - (var_N2_a * GF_current) ) + / ( 1.0 - GF_current + (GF_current / var_N2_b ) ); + + else p = (p - var_N2_a) * var_N2_b; + if( p > sim_lead_tissue_limit ) { - sim_lead_tissue_no = ci; + sim_lead_tissue_no = ci; sim_lead_tissue_limit = p; } } // for ci @@ -1693,7 +2616,6 @@ ////////////////////////////////////////////////////////////////////////////// // clear_deco_table // -// unchanged in v.101 // static void clear_deco_table(void) { @@ -1704,55 +2626,73 @@ internal_deco_time [x] = 0; internal_deco_depth[x] = 0; } + + // clear stop table overflow warning + char_O_deco_warnings &= ~DECO_WARNING_STOPTABLE_OVERFLOW; } ////////////////////////////////////////////////////////////////////////////// // update_deco_table // -// Add 1 min to current stop. +// Add time to a stop at temp_depth_limit +// +// It is possible to create stops with a duration of 0 minutes, e.g. to +// note a gas change "on the fly" while ascending. Therefore the criteria +// to have reached the end of the list needs always to be depth == 0. // -// Inputs: -// temp_depth_limit = stop's depth, in meters. -// In/Out: -// internal_deco_depth[] : depth (in metres) of each stops. -// internal_deco_time [] : time (in minutes) of each stops. +// Input: temp_depth_limit : stop's depth, in meters. +// sim_gas_last_used : gas used at stop, as index 1..5 or 0 for gas 6 +// PARAMETER time_increment : number of minutes to add to the stop // -static unsigned char update_deco_table() +// Updated: internal_deco_depth[] : depth (in meters) of each stop +// internal_deco_time [] : time (in minutes) of each stop +// internal_deco_gas [] : gas used (index 1-5) at each stop +// +static unsigned char update_deco_table(PARAMETER unsigned char time_increment) { - overlay unsigned char x; - assert( temp_depth_limit < 128 ); // Can't be negativ (overflown). - assert( temp_depth_limit > 0 ); // No stop at surface... - - for(x=0; x<NUM_STOPS; ++x) - { - // Make sure deco-stops are recorded in order: - assert( !internal_deco_depth[x] || temp_depth_limit <= internal_deco_depth[x] ); - - if( internal_deco_depth[x]== temp_depth_limit ) - { - // Do not overflow (max 255') - if( internal_deco_time[x] < 255 ) - { - internal_deco_time[x]++; - return 1; - } - // But store extra in the next stop... - } - - if( internal_deco_depth[x] == 0 ) - { - internal_deco_depth[x] = temp_depth_limit; - - internal_deco_time[x] = 1; - internal_deco_gas[x] = sim_gas_last_used; - return 1; - } - } - - // Can't store stops at more than 96m. - // Or stops at less that 3m too. - // Just do nothing with that... - return 0; + overlay unsigned char x; + + assert( temp_depth_limit > 0 ); // No stop at surface... + + // loop through internal deco table + for(x=0; x<NUM_STOPS; ++x) + { + // Make sure deco-stops are recorded in order: + assert( !internal_deco_depth[x] || temp_depth_limit <= internal_deco_depth[x] ); + + // Is there already a stop entry for our current depth? + if( internal_deco_depth[x] == temp_depth_limit ) + { + // Yes - increment stop time if possible + // Stop time entries are limited to 99 minutes because of display constraints. + // Else a limit of 254 would account because of constrains in calc_CNS_planning(). + if( internal_deco_time[x] < (100 - time_increment) ) + { + internal_deco_time[x] += time_increment; // increment stop time + return 1; // return with status 'success' + } + } + + // If program flow passes here, there is either no stop entry for the current depth yet, or + // the existing entry is saturated with 99 minutes. So we are looking for the next unused + // table entry. + if( internal_deco_depth[x] == 0 ) + { + internal_deco_time[x] = time_increment; // initialize entry with first stop's time, + internal_deco_depth[x] = temp_depth_limit; // ... depth, and + internal_deco_gas[x] = sim_gas_last_used; // ... gas + return 1; // return with status 'success' + } + } + + // If program flow passes here, all deco table entries are used up. + + // set overflow warning + char_O_deco_warnings |= DECO_WARNING_STOPTABLE_OVERFLOW; + + + // return with status 'failed'. + return 0; } ////////////////////////////////////////////////////////////////////////////// @@ -1770,171 +2710,345 @@ assert( char_O_gtissue_no < NUM_COMP ); assert( 0.800 <= pres_respiration && pres_respiration < 14.0 ); - // tissue > respiration (currently off-gasing) - // GF = 0% when respiration == tissue, ie. bubbles are at equilibrium. - // GF = 100% when respiration == limit. + // tissue > respiration (currently off-gassing) + // GF = 0.00 when respiration == tissue, ie. dissolved gases are at equilibrium. + // GF = 1.00 when respiration == limit. temp_tissue = N2 + He; if( temp_tissue <= pres_respiration ) + { gf = 0.0; + int_O_gradient_factor = 0; + } else { overlay float limit = calc_lead_tissue_limit; // NOTE: in GF model, calc_lead_tissue_limit include already the // correction due to gradient factor. To compute the actual - // current GF, we need to (re-)compute the raw ambiant-pressure + // current GF, we need to (re-)compute the raw ambient-pressure // limit from the Buhlmann model. if( char_I_deco_model != 0 ) { ci = char_O_gtissue_no; - read_buhlmann_coefficients(); + + read_Buhlmann_coefficients(); + var_N2_a = (var_N2_a * N2 + var_He_a * He) / temp_tissue; var_N2_b = (var_N2_b * N2 + var_He_b * He) / temp_tissue; - limit = (temp_tissue - var_N2_a) * var_N2_b; + + limit = (temp_tissue - var_N2_a) * var_N2_b; } - gf = (temp_tissue - pres_respiration) - / (temp_tissue - limit) - * 100.0; - if( gf > 254.5 ) gf = 255.0; - if( gf < 0.0 ) gf = 0.0; - } - char_O_gradient_factor = (unsigned char)(gf+0.5f); - + gf = (temp_tissue - pres_respiration) / (temp_tissue - limit); + + // limit to 255 because of constraints in ghostwriter code + if ( gf <= 0.0 ) int_O_gradient_factor = 0; + else if( gf > 2.545 ) int_O_gradient_factor = 255 + INT_FLAG_WARNING; + else + { + int_O_gradient_factor = (unsigned int)(100 * gf + 0.5); + + if ( int_O_gradient_factor >= GF_warning_threshold ) + int_O_gradient_factor |= INT_FLAG_WARNING; + + else if ( int_O_gradient_factor >= char_I_GF_High_percentage ) + int_O_gradient_factor |= INT_FLAG_PREWARNING; + } + } } ////////////////////////////////////////////////////////////////////////////// -// deco_calc_desaturation_time +// calc_desaturation_time // -// FIXED N2_ratio -// unchanged in v.101 // Inputs: int_I_pres_surface, ppWater, char_I_desaturation_multiplier -// Outputs: int_O_desaturation_time, char_O_tissue_saturation[0..31] +// Outputs: int_O_desaturation_time, int_O_nofly_time // -void deco_calc_desaturation_time(void) +// Helper function +// +void calc_desaturation_time_helper(void) { - RESET_C_STACK - - assert( 800 < int_I_pres_surface && int_I_pres_surface < 1100 ); - assert( 0 < char_I_desaturation_multiplier && char_I_desaturation_multiplier <= 100 ); - - N2_ratio = 0.7902; // FIXED sum as stated in buhlmann - pres_surface = int_I_pres_surface * 0.001; - ppN2 = N2_ratio * (pres_surface - ppWater); - int_O_desaturation_time = 0; - float_desaturation_multiplier = char_I_desaturation_multiplier * (0.01 * SURFACE_DESAT_FACTOR); - - for(ci=0; ci<NUM_COMP; ci++) + if( pres_actual > pres_target ) // check if actual pressure is higher then target pressure + { // YES - compute remaining time + overlay float pres_ratio; + + pres_ratio = pres_actual / pres_target; + + // Compute desaturation time with result rounded up to multiples of 10 minutes. + // Main purpose is to avoid confusion, because the times do not clock down in one minute steps any more + // but get constantly re-computed according to current ambient pressure and may therefor make steps of + // several minutes forwards and backwards as ambient pressure rises and falls. + short_time = (unsigned short)( (var_ht * log(pres_ratio) / desat_factor) + 0.9 ); + } + else + { // NO - desaturation state reached, no remaining time + short_time = 0; + } +} + +///////////////////////////////////////////////////////////////////////////// +// Main function +// +void calc_desaturation_time(void) +{ + assert( 800 < int_I_pres_surface && int_I_pres_surface < 1100 ); + assert( 0 < char_I_desaturation_multiplier && char_I_desaturation_multiplier <= 100 ); + + + N2_ratio = 0.7902; // fraction of N2 in respired air + pres_surface = 0.001 * int_I_pres_surface; // surface pressure in bar + N2_equilibrium = N2_ratio * (pres_surface - ppWater); // partial pressure of N2 in respired air + desat_factor = 0.06931 * char_I_desaturation_multiplier * SURFACE_DESAT_FACTOR; // pre-computed term for later use: + // 10 [Min] * 0.01 [%] * 0.6931 [ln(2)] * ... + int_O_desaturation_time = 0; + int_O_nofly_time = 0; + + + for(ci=NUM_COMP; ci>0;) { - overlay unsigned short desat_time; // For a particular compartiment, in min. - overlay float temp1; - overlay float temp2; - overlay float temp3; - overlay float temp4; - - read_buhlmann_ht(); - - // saturation_time (for flight) and N2_saturation in multiples of halftime - // version v.100: 1.1 = 10 percent distance to totally clean (totally clean is not possible, would take infinite time ) - // new in version v.101: 1.07 = 7 percent distance to totally clean (totally clean is not possible, would take infinite time ) - // changes in v.101: 1.05 = 5 percent dist to totally clean is new desaturation point for display and NoFly calculations - // N2 - temp1 = 1.05 * ppN2 - pres_tissue_N2[ci]; - temp2 = ppN2 - pres_tissue_N2[ci]; - if (temp2 >= 0.0) - temp1 = 0.0; - else - temp1 = temp1 / temp2; - - if( 0.0 < temp1 && temp1 < 1.0 ) - { - // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested. - // minus because log is negative. - temp1 = log(1.0 - temp1) / -0.6931; // temp1 is the multiples of half times necessary. - temp2 = var_N2_ht * temp1 / float_desaturation_multiplier; // time necessary (in minutes ) for complete desaturation (see comment about 5 percent) - } - else - { - temp1 = 0.0; - temp2 = 0.0; - } - - // He - temp3 = 0.1 - pres_tissue_He[ci]; - if (temp3 >= 0.0) - temp3 = 0.0; - else - temp3 = - temp3 / pres_tissue_He[ci]; - - if( 0.0 < temp3 && temp3 < 1.0 ) - { - temp3 = log(1.0 - temp3) / -0.6931; // temp1 is the multiples of half times necessary. - // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested. - // minus because log is negative - temp4 = var_He_ht * temp3 / float_desaturation_multiplier; // time necessary (in minutes ) for "complete" desaturation, new in v.101 float_desaturation_multiplier - } - else - { - temp3 = 0.0; - temp4 = 0.0; - } - - // saturation_time (for flight) - if (temp4 > temp2) - desat_time = (unsigned short)temp4; - else - desat_time = (unsigned short)temp2; - - if(desat_time > int_O_desaturation_time) - int_O_desaturation_time = desat_time; - - // N2 saturation in multiples of halftime for display purposes - temp2 = temp1 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8 - temp2 = temp2 + 80.0; // set center - if (temp2 < 0.0) - temp2 = 0.0; - if (temp2 > 255.0) - temp2 = 255.0; - char_O_tissue_N2_saturation[ci] = (char)temp2; - - // He saturation in multiples of halftime for display purposes - temp4 = temp3 * 20.0; // 0 = 1/8, 120 = 0, 249 = 8 - temp4 = temp4 + 80.0; // set center - if (temp4 < 0.0) - temp4 = 0.0; - if (temp4 > 255.0) - temp4 = 255.0; - char_O_tissue_He_saturation[ci] = (char)temp4; - } // for + overlay float pres_tissue_max; + overlay float P_ambient_altitude; + overlay signed char search_direction; + overlay unsigned short nofly_N2 = 0; + overlay unsigned short nofly_He = 0; + overlay unsigned short nofly_last = ~0; + + + ci -= 1; + + read_Buhlmann_ht(); + read_Buhlmann_coefficients(); + + // get selected target altitude + switch( char_I_altitude_wait ) + { + case 1: P_ambient_altitude = P_ambient_1000m; break; + case 2: P_ambient_altitude = P_ambient_2000m; break; + case 3: P_ambient_altitude = P_ambient_3000m; break; + default: P_ambient_altitude = P_ambient_fly; break; + } + + // Target pressure for the tissue is the Buhlmann limit. We use the Buhlmann + // coefficients for N2 also for He because it is easier to calculate and the + // N2 coefficients are more conservative than those for He, so we are on the + // safe side, too. + pres_tissue_max = (P_ambient_altitude/var_N2_b + var_N2_a); + + // Adjust target pressure in case the GF model is in use by GF-high + if( char_I_deco_model != 0 ) + { + pres_tissue_max = ((pres_tissue_max - P_ambient_altitude) * char_I_GF_High_percentage * 0.01) + P_ambient_altitude; + } + + + // + // Desaturation time + // + + // N2: actual amount of tissue pressure above equilibrium. + pres_actual = pres_tissue_N2[ci] - N2_equilibrium; + + // N2: half-time of the current tissue + var_ht = var_N2_ht; + + // Calculate desaturation time for N2 in tissue. + // Desaturated state is defined as residual tissue pressure <= 1.05 x ppN2 respired + + pres_target = 0.05 * N2_equilibrium; + + calc_desaturation_time_helper(); + + if( short_time > int_O_desaturation_time) int_O_desaturation_time = short_time; + + + // He: actual amount of tissue pressure above equilibrium. + pres_actual = pres_tissue_He[ci]; // equilibrium for He is 0 bar + + // He: half-time of the current tissue + var_ht = var_He_ht; + + // Calculate desaturation time for He in the tissue. + // Desaturated state is defined as residual tissue pressure <= 0.05 x ppN2 respired + + pres_target = 0.05 * N2_equilibrium; + + calc_desaturation_time_helper(); + + if( short_time > int_O_desaturation_time) int_O_desaturation_time = short_time; + + + // + // no-fly time + // + + // initialize search direction + search_direction = 0; + + for(;;) + { + // N2: actual amount of tissue pressure above equilibrium. + pres_actual = pres_tissue_N2[ci] - N2_equilibrium; + + // N2: half-time of the current tissue + var_ht = var_N2_ht; + + // Calculate no-fly time for N2 in the tissue. + // Flying is permitted when the N2 pressure fits into the assigned fraction above equilibrium. + + pres_target = (split_N2_He[ci] * 0.01) * (pres_tissue_max - N2_equilibrium); + + if( pres_target < 0.0 ) // check if desaturation to fly target is possible + { + int_O_nofly_time = 288; // NO - set no-fly time to 288 * 10 min = 48 h + break; // done for this compartment + } + else + { + calc_desaturation_time_helper(); + nofly_N2 = short_time; + } + + // He: actual amount of tissue pressure above equilibrium - equilibrium for He is 0 bar. + pres_actual = pres_tissue_He[ci]; + + // He: half-time of the current tissue + var_ht = var_He_ht; + + // Calculate no-fly time for He in the tissue. + // Flying is permitted when the He pressure fits into the assigned fraction. + + pres_target = ((100 - split_N2_He[ci]) * 0.01) * (pres_tissue_max - N2_equilibrium); + + calc_desaturation_time_helper(); + nofly_He = short_time; + + + // Because the sum of N2 and He tissue pressures needs to fit into the Buhlmann limit for + // no-fly time calculation, each gas gets assigned a fraction of the available total pressure + // limit. The optimum split between the two gases can not be computed by a single formular, + // because this would require the inversion of a function with two exponential terms, which is + // not possible. We do not want to do a computational complex simulation here like it is done + // in the deco calculation code (although we tackle the same base problem here), so we just let + // the computer try out which split will balance the no-fly times induced by the N2 and the He + // at best. + + // first of all, skip any optimization in case the current compartment is not the leading one + if( (nofly_N2 <= int_O_nofly_time) && (nofly_He <= int_O_nofly_time) ) break; + + // check if the N2 requires more waiting time than the He + if( nofly_N2 >= nofly_He ) + { + // check if the search direction has changed, which means we are beyond the + // optimum now, or if we are at the upper stop limit of split_N2_He + if( (search_direction < 0) || (split_N2_He[ci] == 99) ) + { + // Either the just completed iteration was more close to the optimum or the one before + // was, so we take the best (i.e. shortest) time of both as the final no-fly time. + int_O_nofly_time = (nofly_N2 < nofly_last) ? nofly_N2 : nofly_last; + break; + } + + // store the no-fly time found in this iteration + nofly_last = nofly_N2; + + // increase the N2 fraction of the split and set search direction towards more N2 + split_N2_He[ci] += 1; + search_direction = +1; + } + else + { + // check if the search direction has changed, which means we are beyond the + // optimum now, or if we are at the lower stop limit of split_N2_He + if( (search_direction > 0) || (split_N2_He[ci] == 1) ) + { + // Either the just completed iteration was more close to the optimum or the one before + // was, so we take the best (i.e. shortest) time of both as the final no-fly time. + int_O_nofly_time = (nofly_He < nofly_last) ? nofly_He : nofly_last; + break; + } + + // store the no-fly time found in this iteration + nofly_last = nofly_He; + + // decrease the N2 fraction of the split and set search direction towards less N2 + split_N2_He[ci] -= 1; + search_direction = -1; + } + + } // for(;;) + + } // for(compartments) + + + // Rescale int_O_desaturation_time and int_O_nofly_time to full minutes for display purpose + int_O_desaturation_time *= 10; + int_O_nofly_time *= 10; + + // Limit int_O_desaturation_time and int_O_nofly_time to 5999 = 99 hours + 59 minutes + // because of display space constraints and rounding done above. + if( int_O_desaturation_time > 5999 ) int_O_desaturation_time = 5999; + if( int_O_nofly_time > 5999 ) int_O_nofly_time = 5999; + + + // Clear the microbubbles warning when the current gradient factor is < GF_warning_threshold. + // As the locked warning will stay set, this will cause the warning be be displayed in attention + // color instead of warning color. + if( int_O_gradient_factor < GF_warning_threshold ) char_O_deco_warnings &= ~DECO_WARNING_MBUBBLES; + + // clear some warnings when the desaturation time has become zero + if( int_O_desaturation_time == 0 ) char_O_deco_warnings &= ~( DECO_WARNING_IBCD + DECO_WARNING_IBCD_lock + + DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock + + DECO_WARNING_OUTSIDE + DECO_WARNING_OUTSIDE_lock ); + } ////////////////////////////////////////////////////////////////////////////// // calc_wo_deco_step_1_min // -// FIXED N2 Ratio // optimized in v.101 (...saturation_multiplier) // desaturation slowed down to 70,42% // +// Input: int_I_pres_surface [mbar] +// static void calc_wo_deco_step_1_min(void) { - assert( 800 < int_I_pres_surface && int_I_pres_surface < 1100 ); - assert( 800 < int_I_pres_respiration && int_I_pres_respiration < 1100 ); - assert( 100 <= char_I_saturation_multiplier && char_I_saturation_multiplier < 200 ); - assert( 0 < char_I_desaturation_multiplier && char_I_desaturation_multiplier <= 100 ); - - N2_ratio = 0.7902; // FIXED, sum lt. buehlmann + assert( 800 < int_I_pres_surface && int_I_pres_surface < 1100 ); + assert( 100 <= char_I_saturation_multiplier && char_I_saturation_multiplier < 200 ); + assert( 0 < char_I_desaturation_multiplier && char_I_desaturation_multiplier <= 100 ); + + // setup input data for deco routines pres_respiration = pres_surface = int_I_pres_surface * 0.001; - ppN2 = N2_ratio * (pres_respiration - ppWater); - ppHe = 0.0; - float_desaturation_multiplier = char_I_desaturation_multiplier * (0.01 * SURFACE_DESAT_FACTOR); + + N2_ratio = 0.7902; // according to Buhlmann + N2_equilibrium = N2_ratio * (pres_surface - ppWater); // used for N2 tissue graphics scaling + ppN2 = N2_ratio * (pres_respiration - ppWater); + ppHe = 0.0; + + float_desaturation_multiplier = char_I_desaturation_multiplier * 0.01 * SURFACE_DESAT_FACTOR; float_saturation_multiplier = char_I_saturation_multiplier * 0.01; - calc_tissue(1); // update the pressure in the tissues N2/He in accordance with the new ambient pressure - - clear_deco_table(); - char_O_deco_status = 3; // surface new in v.102 : stays in surface state. - char_O_nullzeit = 0; - int_O_ascenttime = 0; - int_O_extra_ascenttime = 0; + + // program what to do: 128 = Flag for "real" tissues, 1 = 1 minute + tissue_increment = 128 + 1; + + // update the pressure in the tissues N2/He in accordance with the new ambient pressure + calc_tissue(); + + // clock down CNS by a 1 minute step + //CNS_fraction *= 0.992327946; // is done in deco_calc_CNS_decrease_15min + + // compute integer copy of CNS value + //compute_CNS_for_display(); // is done in deco_calc_CNS_decrease_15min + + // reset deco engine start condition (probably not needed to be done here...) + char_O_deco_status &= ~DECO_STATUS_MASK; // clear bits + char_O_deco_status |= DECO_STATUS_INIT; // set bits + + // reset some more data that are not applicable in surface mode + char_O_nullzeit = 0; + int_O_ascenttime = 0; + int_O_alternate_ascenttime = 0; + clear_deco_table(); + + // calculate gradient factor calc_gradient_factor(); } @@ -1943,8 +3057,9 @@ // // Prepare tissue for delay before the next dive simulation. // -// Inputs: char_I_dive_interval == delay before dive (in 10' steps). -// Outputs: pres_tissue_N2/He[], CNS_fraction +// Inputs: char_I_dive_interval == delay before dive (in 1 Minute steps). +// Modified: CNS_fraction, int_O_CNS_fraction +// pres_tissue_N2/He[] // // Should be protected by deco_push_tissues_to_vault(), // deco_pull_tissues_from_vault() @@ -1956,397 +3071,700 @@ overlay unsigned char t; //---- Initialize simulation parameters ---------------------------------- - N2_ratio = 0.7902; // FIXED, sum lt. buehlmann pres_respiration = pres_surface = int_I_pres_surface * 0.001; - ppN2 = N2_ratio * (pres_respiration - ppWater); - ppHe = 0.0; - float_desaturation_multiplier = char_I_desaturation_multiplier * (0.01 * SURFACE_DESAT_FACTOR); + + N2_ratio = 0.7902; // according to buehlmann + N2_equilibrium = N2_ratio * (pres_surface - ppWater); // used for N2 tissue graphics scaling + ppN2 = N2_ratio * (pres_respiration - ppWater); + ppHe = 0.0; + + float_desaturation_multiplier = char_I_desaturation_multiplier * 0.01 * SURFACE_DESAT_FACTOR; float_saturation_multiplier = char_I_saturation_multiplier * 0.01; - + //---- Perform simulation ------------------------------------------------ - for(t=0; t<char_I_dive_interval; ++t) - { - calc_tissue(2); // period = 10min. - CNS_fraction = 0.92587471 * CNS_fraction; // Half-time = 90min: (1/2)^(1/9) - } - assert( 0.0 <= CNS_fraction && CNS_fraction <= 9.99 ); // 999 % - int_O_CNS_fraction = (unsigned short)(CNS_fraction * 100.0 + 0.5); - -} - -////////////////////////////////////////////////////////////////////////////// -// deco_clear_CNS_fraction -// -// new in v.101 -// -void deco_clear_CNS_fraction(void) -{ - RESET_C_STACK - - CNS_fraction = 0.0; - int_O_CNS_fraction = 0; + + // Calculate tissues: + // Because tissue_increment is limited to 127 minutes, we have to do two passes + // in case char_I_dive_interval is bigger than 127. + // Ops: char_I_dive_interval must be limited to 254! + + t = char_I_dive_interval; + + if ( t == 255 ) t = 254; + + if ( t > 127 ) // extra pass needed? + { + tissue_increment = 127 // dive interval length in minutes + | 128; // Flag to update the "real" tissues + + calc_tissue(); // update tissues + + t -= 127; // calculate remaining dive interval length + } + + tissue_increment = t // dive interval length in minutes to do + | 128; // Flag to update the "real" tissues + calc_tissue(); // update tissues + + + // Calculate CNS: + // To speed up things and because on most invocations of this code char_I_dive_interval + // is a multiple of 10 minutes, we loop the loop-counter down using two speeds. + + t = char_I_dive_interval; + + while ( t ) + { + if( t > 9 ) + { + CNS_fraction *= 0.925874712; // Half-time = 90min -> 10 min: (1/2)^(1/9) + t -= 10; // fast speed looping + } + else + { + CNS_fraction *= 0.992327946; // Half-time = 90min -> 1 min: (1/2)^(1/90) + t -= 1; // slow speed looping + } + } + + // compute integer copy of CNS value + compute_CNS_for_display(); } ////////////////////////////////////////////////////////////////////////////// -// deco_calc_CNS_fraction +// clear_CNS_fraction // -// Input: char_I_actual_ppO2 : Current condition (in decibars). -// char_I_step_is_1min : use 1min or 10min steps instead of 2sec. -// CNS_fraction : velue before period. -// Output: CNS_fraction, int_O_CNS_fraction +// new in v.101 // -void deco_calc_CNS_fraction(void) +void clear_CNS_fraction(void) { - overlay float time_factor = 1.0f; - RESET_C_STACK - - assert( 0.0 <= CNS_fraction && CNS_fraction <= 9.99 ); - assert( char_I_actual_ppO2 > 15 ); - - if( char_I_step_is_1min == 1 ) - time_factor = 30.0f; - else if( char_I_step_is_1min == 2 ) - time_factor = 300.0f; + CNS_fraction = CNS_sim_norm_fraction = CNS_sim_alt_fraction = 0; + int_O_CNS_fraction = int_O_normal_CNS_fraction = int_O_alternate_CNS_fraction = 0; +} + +////////////////////////////////////////////////////////////////////////////// +// calc_CNS_fraction +// +// Input: char_actual_ppO2 : current ppO2 [decibars] +// tissue_increment : time increment and tissue selector +// CNS_fraction : current CNS% as float before period +// +// Output: CNS_fraction, int_O_CNS_fraction - for the real tissues +// CNS_sim_norm_fraction, int_O_normal_CNS_fraction - in simulation mode, normal plan +// CNS_sim_alt_fraction, int_O_alternate_CNS_fraction - in simulation mode, alternative plan +// +void calc_CNS_fraction(void) +{ + overlay float time_factor = 1.0; // default is 2sec + overlay float CNS_fraction_temp = 0.0; + + assert( char_actual_ppO2 > 15 ); + + // All deco code is now invoked every second. But as the CNS update is based on + // 2 seconds periods, we skip every 2nd seconds-based invocation of this function. + // 128 = 128 (flag for "real" CNS) + 0 (2 seconds period) + // To distribute computational load, the CNS% is calculated in "the other second" + // than the tissues. + if( (tissue_increment == 128) && (twosectimer) ) return; + + // adjust time factor if minute-based stepping is commanded, mask out flag bit + if( tissue_increment & 127 ) time_factor = 30.0 * (float)(tissue_increment & 127); + + //------------------------------------------------------------------------ // Don't increase CNS below 0.5 bar, but keep it steady. - if (char_I_actual_ppO2 < 50) + if (char_actual_ppO2 < 50) ; // no changes //------------------------------------------------------------------------ // Below (and including) 1.60 bar - else if (char_I_actual_ppO2 < 61) - CNS_fraction += time_factor/(-533.07 * char_I_actual_ppO2 + 54000.0); - else if (char_I_actual_ppO2 < 71) - CNS_fraction += time_factor/(-444.22 * char_I_actual_ppO2 + 48600.0); - else if (char_I_actual_ppO2 < 81) - CNS_fraction += time_factor/(-355.38 * char_I_actual_ppO2 + 42300.0); - else if (char_I_actual_ppO2 < 91) - CNS_fraction += time_factor/(-266.53 * char_I_actual_ppO2 + 35100.0); - else if (char_I_actual_ppO2 < 111) - CNS_fraction += time_factor/(-177.69 * char_I_actual_ppO2 + 27000.0); - else if (char_I_actual_ppO2 < 152) - CNS_fraction += time_factor/( -88.84 * char_I_actual_ppO2 + 17100.0); - else if (char_I_actual_ppO2 < 167) - CNS_fraction += time_factor/(-222.11 * char_I_actual_ppO2 + 37350.0); + else if (char_actual_ppO2 < 61) + CNS_fraction_temp = time_factor/(-533.07 * char_actual_ppO2 + 54000.0); + else if (char_actual_ppO2 < 71) + CNS_fraction_temp = time_factor/(-444.22 * char_actual_ppO2 + 48600.0); + else if (char_actual_ppO2 < 81) + CNS_fraction_temp = time_factor/(-355.38 * char_actual_ppO2 + 42300.0); + else if (char_actual_ppO2 < 91) + CNS_fraction_temp = time_factor/(-266.53 * char_actual_ppO2 + 35100.0); + else if (char_actual_ppO2 < 111) + CNS_fraction_temp = time_factor/(-177.69 * char_actual_ppO2 + 27000.0); + else if (char_actual_ppO2 < 152) + CNS_fraction_temp = time_factor/( -88.84 * char_actual_ppO2 + 17100.0); + else if (char_actual_ppO2 < 167) + CNS_fraction_temp = time_factor/(-222.11 * char_actual_ppO2 + 37350.0); //------------------------------------------------------------------------ // Arieli et all.(2002): Modeling pulmonary and CNS O2 toxicity: // J Appl Physiol 92: 248--256, 2002, doi:10.1152/japplphysiol.00434.2001 // Formula (A1) based on value for 1.55 and c=20 // example calculation: Sqrt((1.7/1.55)^20)*0.000404 - else if (char_I_actual_ppO2 < 172) - CNS_fraction += time_factor*0.00102; - else if (char_I_actual_ppO2 < 177) - CNS_fraction += time_factor*0.00136; - else if (char_I_actual_ppO2 < 182) - CNS_fraction += time_factor*0.00180; - else if (char_I_actual_ppO2 < 187) - CNS_fraction += time_factor*0.00237; - else if (char_I_actual_ppO2 < 192) - CNS_fraction += time_factor*0.00310; - else if (char_I_actual_ppO2 < 198) - CNS_fraction += time_factor*0.00401; - else if (char_I_actual_ppO2 < 203) - CNS_fraction += time_factor*0.00517; - else if (char_I_actual_ppO2 < 233) - CNS_fraction += time_factor*0.0209; + else if (char_actual_ppO2 < 172) + CNS_fraction_temp = time_factor*0.00102; + else if (char_actual_ppO2 < 177) + CNS_fraction_temp = time_factor*0.00136; + else if (char_actual_ppO2 < 182) + CNS_fraction_temp = time_factor*0.00180; + else if (char_actual_ppO2 < 187) + CNS_fraction_temp = time_factor*0.00237; + else if (char_actual_ppO2 < 192) + CNS_fraction_temp = time_factor*0.00310; + else if (char_actual_ppO2 < 198) + CNS_fraction_temp = time_factor*0.00401; + else if (char_actual_ppO2 < 203) + CNS_fraction_temp = time_factor*0.00517; + else if (char_actual_ppO2 < 233) + CNS_fraction_temp = time_factor*0.0209; else - CNS_fraction += time_factor*0.0482; // value for 2.5 - - if( CNS_fraction > 9.99) // Limit display to 999% - CNS_fraction = 9.99; - if( CNS_fraction < 0.0 ) - CNS_fraction = 0.0; - - int_O_CNS_fraction = (unsigned short)(100.0 * CNS_fraction + 0.5); + CNS_fraction_temp = time_factor*0.0482; // value for 2.5 bar, used for 2.33 bar and above + + + // Check from where we were called: + // flag (bit 7) is set -> we were called from calc_hauptroutine() + // flag (bit 7) not set -> we were called from the deco planning routines + if ( tissue_increment & 128 ) CNS_fraction += CNS_fraction_temp; // real tissues + else if ( char_O_deco_status & DECO_PLAN_ALTERNATE ) CNS_sim_alt_fraction += CNS_fraction_temp; // alternative plan + else CNS_sim_norm_fraction += CNS_fraction_temp; // normal plan + } ////////////////////////////////////////////////////////////////////////////// -// deco_calc_CNS_planning +// calc_CNS_planning // // Compute CNS during predicted ascent. // // Note: Needs a call to deco_push_tissues_to_vault(), // deco_pull_tissues_from_vault() to avoid trashing everything... // -// Input: CNS_fraction, char_O_deco_time[], char_O_deco_depth[] -// Output: CNS_fraction, int_O_CNS_fraction +// Input: CNS_fraction, internal_deco_time[], internal_deco_depth[], internal_deco_gas[] +// Output: CNS_fraction, int_O_normal_CNS_fraction / int_O_alternate_CNS_fraction // -void deco_calc_CNS_planning(void) +void calc_CNS_planning(void) { - overlay unsigned char backup_gas_last_depth; - overlay unsigned char backup_gas_last_used; - overlay unsigned short backup_dive_mins; - overlay unsigned char backup_actual_ppO2; - - RESET_C_STACK - - // Backup state machine - backup_gas_last_depth = sim_gas_last_depth; - backup_gas_last_used = sim_gas_last_used; - backup_dive_mins = sim_dive_mins; - backup_actual_ppO2 = char_I_actual_ppO2; - - // Uses 1min CNS period: - char_I_step_is_1min = 1; - - //---- Retrieve bottom Gas used, and set variables. - sim_gas_last_used = char_I_first_gas; - sim_gas_last_depth = 0; // Surface gas marker. - gas_switch_set(); // Sets initial calc_N2/He_ratio - - //---- CCR mode : do the full TTS at once -------------------------------- - if( char_I_const_ppO2 != 0 ) + // start with CNS% we already have + if( char_O_deco_status & DECO_PLAN_ALTERNATE ) CNS_sim_alt_fraction = CNS_fraction; + else CNS_sim_norm_fraction = CNS_fraction; + + + //---- CCR mode : do the full TTS at once --------------------------------- + + if( ((char_O_deco_status & DECO_MODE_MASK) == DECO_MODE_CCR) ) + { + overlay unsigned short t; // needs 16 bits here ! + + // get current ppO2 from sensors or setpoint + char_actual_ppO2 = char_I_const_ppO2; + + // calculate CNS% for the period of additional staying at bottom depth (fTTS / delayed ascent) + if( char_O_deco_status & DECO_ASCENT_DELAYED) + { + tissue_increment = char_I_extra_time; // must be limited to 127, is limited by range of char_I_extra_time + calc_CNS_fraction(); + } + + // get the ascent time dependent on the current plan + t = (char_O_deco_status & DECO_PLAN_ALTERNATE) ? int_O_alternate_ascenttime : int_O_ascenttime; + + // start simulating CNS% in chunks of 127 minutes + tissue_increment = 127; + + while( t > 127 ) + { + t -= 127; // tissue_increment is limited to 127 minutes because of flag in bit 7 + calc_CNS_fraction(); // calculate CNS in chunks of full 127 minutes + } + + tissue_increment = (char)t; // get the remaining minutes <= 127 + calc_CNS_fraction(); // calculate CNS for the remaining minutes + } + else //---- OC mode and pSCR without sensors: have to follow all gas switches... ----- { - overlay unsigned short t; // Needs 16bits here ! - char_I_actual_ppO2 = char_I_const_ppO2; - for(t=0; t<int_O_ascenttime; ++t) - deco_calc_CNS_fraction(); - } - else //---- OC mode : have to follow all gas switches... ----------------- - { - overlay unsigned char i = 0; // Decostop loop counter - overlay float actual_ppO2; - overlay unsigned char time, t; - - //---- Ascent to surface delay - // NOTE: count as if time is spent with bottom pressure, - // AND the bottom gas - actual_ppO2 = (pres_surface + char_I_bottom_depth * METER_TO_BAR) - * (1.0 - calc_N2_ratio - calc_He_ratio); - if( actual_ppO2 < 0.0 ) actual_ppO2 = 0.0; - if( actual_ppO2 > 2.50 ) actual_ppO2 = 2.55; - char_I_actual_ppO2 = (unsigned char)(100.0 * actual_ppO2 + 0.5); - - // Ascent time (rounded up): - time = (unsigned char)(0.1 * char_I_bottom_depth + 0.5); - - for(t=0; t<time; ++t) - { - deco_calc_CNS_fraction(); - sim_dive_mins++; - } - - //---- Do all further stops ------------------------------------------ + overlay float float_actual_ppO2; + overlay float abs_pres; + + overlay unsigned char stop_depth; + overlay unsigned char last_gas; + overlay unsigned char i; // stop table index + + + // retrieve bottom gas: 1-5 for the configured gases or 0 for the manually set gas + last_gas = sim_gas_last_used = sim_gas_first_used; + + // get the calc_N2/He/O2_ratios of the bottom gas + gas_switch_set(); + + // calculate absolute pressure + abs_pres = pres_surface + bottom_depth * METER_TO_BAR; + + // switch on deco mode pSCR / OC + if( char_O_deco_status & DECO_MODE_PSCR ) + { + //---- pSCR calculated -------------------------------------------- + + // abs_pres is 0.0 ... in bar + // calc_O2_ratio is 0.0 ... 1.0 as factor + // char_I_PSCR_drop is 0 ... 15 as % + // char_I_PSCR_lungratio is 5 ... 20 as % + // float_actual_ppO2 is 0.0 ... in cbar (!) + + float_actual_ppO2 = (100 * abs_pres * calc_O2_ratio) + - (1.0 - calc_O2_ratio) * char_I_PSCR_drop * char_I_PSCR_lungratio; + } + else + { + //---- OC --------------------------------------------------------- + + float_actual_ppO2 = abs_pres * calc_O2_ratio * 100; // in cbar (!) + } + + // caution: float_actual_ppO2 is in cbar here! + if ( float_actual_ppO2 < 0.0 ) char_actual_ppO2 = 0; + else if ( float_actual_ppO2 > 254.5 ) char_actual_ppO2 = 255; + else char_actual_ppO2 = (unsigned char)(float_actual_ppO2 + 0.5); + + + // simulate extended bottom time (fTTS) / delay before ascent (bailout) if configured + if( char_O_deco_status & DECO_ASCENT_DELAYED ) + { + tissue_increment = char_I_extra_time; // must be limited to 127, is limited by range of char_I_extra_time + calc_CNS_fraction(); + } + + + // For simplicity reason (non-linearity of the relation between ppO2 and CNS increments), the + // whole ascent is calculated with bottom ppO2. This errs, but it does so to the safe side. + + // calculate ascent time (integer division and generous round-up) + tissue_increment = bottom_depth / char_I_ascent_speed + 1; + + // ** commented out - not needed when char_I_ascent_speed is limited to a + // ** minimum of 2.something, it is indeed limited to 5. + // + // // limit tissue_increment to 127 minutes + // if( tissue_increment > 127 ) tissue_increment = 127; + + // simulate the CNS increase + calc_CNS_fraction(); + + + //---- Stops --------------------------------------------------------- + for(i=0; i<NUM_STOPS; ++i) { - overlay unsigned char stop_gas; - - //---- Get next stop --------------------------------------------- - { - time = char_O_deco_time[(NUM_STOPS-1)-i]; - temp_depth_limit = char_O_deco_depth[(NUM_STOPS-1)-i]; - stop_gas = char_O_deco_gas[(NUM_STOPS-1)-i]; - } - if( time == 0 ) continue; - - //---- Gas Switch ? ---------------------------------------------- - if( stop_gas != sim_gas_last_used ) + // get the depth of the stop + stop_depth = internal_deco_depth[i]; + + // did we reach the last entry (depth = 0)? if yes, done + if (stop_depth == 0) break; + + // get the duration of the stop and the gas breathed + tissue_increment = internal_deco_time[i]; + sim_gas_last_used = internal_deco_gas[i]; + + // do we have a gas switch? + if( sim_gas_last_used != last_gas ) { - sim_gas_last_depth = deco_gas_change[stop_gas-1]; - sim_gas_last_used = stop_gas; - gas_switch_set(); - } - - //---- Convert Depth and N2_ratio to ppO2 ------------------------ - actual_ppO2 = (pres_surface + temp_depth_limit * METER_TO_BAR) - * (1.0 - calc_N2_ratio - calc_He_ratio); - if( actual_ppO2 < 0.0 ) actual_ppO2 = 0.0; - if( actual_ppO2 > 2.50 ) actual_ppO2 = 2.55; - char_I_actual_ppO2 = (unsigned char)(100.0 * actual_ppO2 + 0.5); - - //---- Apply the stop - for(t=0; t<time; ++t) - { - deco_calc_CNS_fraction(); - sim_dive_mins++; - } + // yes - get new calc ratios + gas_switch_set(); + + // remember new gas as last gas + last_gas = sim_gas_last_used; + } + + // calculate absolute pressure at stop depth + abs_pres = pres_surface + stop_depth * METER_TO_BAR; + + // pSCR mode + if( char_O_deco_status & DECO_MODE_PSCR ) + { + // abs_pres is 0.0 ... in bar + // calc_O2_ratio is 0.0 ... 1.0 as factor + // char_I_PSCR_drop is 0 ... 15 as % + // char_I_PSCR_lungratio is 5 ... 20 as % + // float_actual_ppO2 is 0.0 ... in cbar (!) + + float_actual_ppO2 = (100 * abs_pres * calc_O2_ratio) + - (1.0 - calc_O2_ratio) * char_I_PSCR_drop * char_I_PSCR_lungratio; + } + else // OC mode + { + float_actual_ppO2 = abs_pres * calc_O2_ratio * 100; // in cbar (!) + } + + // caution: float_actual_ppO2 is in cbar here! + if ( float_actual_ppO2 < 0.0 ) char_actual_ppO2 = 0; + else if ( float_actual_ppO2 > 254.5 ) char_actual_ppO2 = 255; + else char_actual_ppO2 = (unsigned char)(float_actual_ppO2 + 0.5); + + + // ** Currently, stop times per stop entry are limited to 99 minutes in update_deco_table(), + // ** so the following code block is not needed at times. + // + // // tissue_increment is limited to 127 when fed to deco_calc_CNS_fraction(), + // // so if the stop is longer than 127 minutes (but not longer than 254 minutes!) + // // we need to calculate the CNS in two chunks. + // if( tissue_increment > 127) + // { + // tissue_increment -= 127; // subtract full 127 minutes and do the "remaining" minutes first + // calc_CNS_fraction(); + // tissue_increment = 127; // catch up with the previously subtracted full 127 minutes + // } + + // calculate CNS% for the stop + calc_CNS_fraction(); } } - - //---- Back to normal mode... -------------------------------------------- - char_I_step_is_1min = 0; - sim_gas_last_depth = backup_gas_last_depth; - sim_gas_last_used = backup_gas_last_used; - sim_dive_mins = backup_dive_mins; - char_I_actual_ppO2 = backup_actual_ppO2; } + ////////////////////////////////////////////////////////////////////////////// -// deco_calc_CNS_decrease_15min +// gas_volumes +// +// calculates volumes and required tank fill pressures for each gas. // -// new in v.101 +// Input: bottom_depth depth of the bottom segment +// char_I_bottom_time duration of the bottom segment +// char_I_extra_time extra bottom time for fTTS / delayed ascent +// float_ascent_speed ascent speed, in meters/minute +// sim_gas_first_used the bottom gas (1-5 for configured gases, 0 for the manual gas) +// internal_deco_depth[] depth of the stops +// internal_deco_time[] duration of the stops +// internal_deco_gas[] gas breathed at the stops +// char_I_bottom_usage gas consumption during bottom part and initial ascent, in liters/minute +// char_I_deco_usage gas consumption during stops and following ascents, in liters/minute +// char_I_tank_size[] size of the tanks for gas 1-5, in liters +// char_I_tank_pres_fill[] fill pressure of the tanks // -// calculates the half time of 90 minutes in 6 steps of 15 min -// (Used in sleepmode, for low battery mode). +// Output: int_O_gas_volumes[] amount of gas needed, in liters +// int_O_tank_pres_need[] in bar, + flags for fast evaluation by dive mode warnings: +// 2^15: pres_need >= pres_fill +// 2^14: pres_need >= press_fill * GAS_NEEDS_ATTENTION_THRESHOLD +// 2^11: pres_need == 0 +// 2^10: pres_need invalid // -// Output: int_O_CNS_fraction -// Uses and Updates: CNS_fraction -// -void deco_calc_CNS_decrease_15min(void) +void gas_volumes_helper(void) +{ + // Calculate the gas volume needed at a given depth, time and usage (SAC rate). + // We use 1.0 for the surface pressure to have stable results when used through + // the deco calculator (simulation mode). + volume = (float_depth * METER_TO_BAR + 1.0) * float_time * usage; + + return; +} + +void gas_volumes(void) { - RESET_C_STACK - assert( 0.0 <= CNS_fraction && CNS_fraction <= 9.99 ); - - CNS_fraction = 0.890899 * CNS_fraction; - int_O_CNS_fraction = (unsigned short)(CNS_fraction * 100.0 + 0.5); + overlay float volumes[NUM_GAS]; + + overlay unsigned char stop_gas; + overlay unsigned char stop_gas_last; + overlay unsigned char stop_time; + overlay unsigned char stop_depth; + overlay unsigned char stop_depth_last; + overlay unsigned char i; + + + //---- initialization ---------------------------------------------------- + + // null the volume accumulators + for(i=0; i<NUM_GAS; ++i) volumes[i] = 0.0; + + // quit for CCR and pSCR mode + if( char_O_deco_status & DECO_MODE_LOOP ) goto done; + + + //---- bottom demand ----------------------------------------------------- + + // sim_gas_first_used : gas used during bottom segment (0, 1-5) + // bottom_depth: depth of the bottom segment + + assert(0 <= sim_gas_first_used && sim_gas_first_used <= NUM_GAS); + + // get the gas used during bottom segment + stop_gas_last = stop_gas = sim_gas_first_used; + + // set the usage (SAC rate) to bottom usage rate for bottom part and initial ascent + usage = char_I_bottom_usage; + + // volumes are only calculated for gases 1-5, but not the manually configured one + if( stop_gas ) + { + // set the bottom depth + float_depth = (float)bottom_depth; + + // calculate either bottom segment or just the fTTS/bailout delayed part + if( char_O_main_status & DECO_BOTTOM_CALCULATE ) + { + // duration of bottom segment + float_time = (float)char_I_bottom_time; + } + else + { + // duration of delayed ascent + float_time = (float)char_I_extra_time; + } + + // calculate gas demand + gas_volumes_helper(); + + // take result + volumes[stop_gas-1] = volume; + } + + + // initialize stop index with first stop + i = 0; + + + //---- initial ascent demand --------------------------------------------- + + // stop_gas : gas from bottom segment + // bottom_depth : depth of the bottom segment in meters + // internal_deco_depth[i=0]: depth of the first stop, may be 0 if no stop exists + + // get the data of the first stop + stop_depth = internal_deco_depth[i]; + stop_time = internal_deco_time[i]; + + // volumes are only calculated for gases 1-5, but not the manually configured one + if( stop_gas ) + { + // compute distance between bottom and first stop + float_depth = (float)bottom_depth - (float)stop_depth; + + // initial ascent exists only if ascent distance is > 0 + if( float_depth > 0.0 ) + { + // compute ascent time + float_time = float_depth / float_ascent_speed; + + // compute average depth between bottom and first stop + float_depth = (float)bottom_depth - float_depth * 0.5; + + // calculate gas demand + gas_volumes_helper(); + + // add result + volumes[stop_gas-1] += volume; + } + } + + // switch the usage (SAC rate) to deco usage rate + // for stops, intermediate and final ascent + usage = char_I_deco_usage; + + // is there a (first) stop? if yes, goto stops processing + if( stop_depth ) goto stops; + + // add demand of a 3 minutes safety stop at 5 meters, at least for contingency... + float_time = 3.0; + float_depth = 5.0; + + // calculate gas demand + gas_volumes_helper(); + + // add result + volumes[stop_gas-1] += volume; + + // proceed to volume conversion and pressure calculations + goto done; + + + //---- intermediate ascent demand --------------------------------------- +inter_ascents: + + // store last stop depth and gas + stop_depth_last = stop_depth; + stop_gas_last = stop_gas; + + // check if we are at the end of the stops table + if( i < NUM_STOPS-1 ) + { + // there are more entries - get the next stop data + i++; + + // get the next stop depth + stop_depth = internal_deco_depth[i]; + + // check if there is indeed another stop, + // if not (depth = 0) treat as end of table + if( stop_depth == 0 ) goto end_of_table; + + // get the next stop duration + stop_time = internal_deco_time[i]; + } + else + { +end_of_table: + + // End of the stops table reached or no more stops: Split the remaining + // ascent into an intermediate ascent and a final ascent by creating a + // dummy stop at the usual last deco stop depth. Stop gas doesn't change. + stop_time = 0; + stop_depth = char_I_depth_last_deco; + } + + // volumes are only calculated for gases 1-5, but not the manually configured one + if( stop_gas_last ) + { + // compute distance between the two stops: + // last stop will always be deeper than current stop + float_depth = (float)(stop_depth_last - stop_depth); + + // compute ascent time + float_time = float_depth / float_ascent_speed; + + // compute average depth between the two stops + float_depth = (float)stop_depth_last - float_depth * 0.5; + + // calculate gas demand + gas_volumes_helper(); + + // add result + volumes[stop_gas_last-1] += volume; + } + + + //---- next stop demand ------------------------------------------------- +stops: + + // convert depth of the stop + float_depth = (float)stop_depth; + + // get the next gas + stop_gas = internal_deco_gas[i]; + + // do we we have a gas change? + if( stop_gas_last && (stop_gas != stop_gas_last) ) + { + // yes - spend an additional char_I_gas_change_time on the old gas + float_time = (float)char_I_gas_change_time; + + // calculate gas demand + gas_volumes_helper(); + + // add result + volumes[stop_gas_last-1] += volume; + } + + // calculate and add demand on new gas for the full stop duration + if( stop_gas ) + { + // get the duration of the stop + float_time = (float)stop_time; + + // calculate gas demand + gas_volumes_helper(); + + // add result to last gas + volumes[stop_gas-1] += volume; + } + + // continue with the next intermediate ascent if this was not the last stop + if( stop_depth > char_I_depth_last_deco ) goto inter_ascents; + + + //---- final ascent demand ----------------------------------------------- +final_ascent: + + // float_depth: depth of last stop + // stop_gas : gas from last stop (0 or 1-5) + + // volumes are only calculated for gases 1-5, but not the manually configured one + if( stop_gas ) + { + // set ascent time according to an ascent speed of 1 meter per minute + float_time = float_depth; + + // set half-way depth + float_depth *= 0.5; + + // calculate gas demand + gas_volumes_helper(); + + // add result + volumes[stop_gas-1] += volume; + } + + + //---- convert results for the assembler interface ----------------------------- +done: + + for(i=0; i<NUM_GAS; ++i) + { + if( volumes[i] >= 65534.5 ) + { + int_O_gas_volumes[i] = 65535; + int_O_tank_pres_need[i] = 999 + INT_FLAG_WARNING; // 999 bar + warning flag for > pres_fill + } + else + { + overlay unsigned short tank_pres_fill = 10.0 * (unsigned short)char_I_tank_pres_fill[i]; + + // No distinct rounding done here because volumes are not accurate to the single liter anyhow + + // convert gas volumes to integers + int_O_gas_volumes[i] = (unsigned short)volumes[i]; + + // compute how much pressure in the tank will be needed [in bar] (integer-division) + int_O_tank_pres_need[i] = (unsigned short)(int_O_gas_volumes[i] / char_I_tank_size[i]); + + // limit to 999 bar because of display constraints + if( int_O_tank_pres_need[i] > 999 ) int_O_tank_pres_need[i] = 999; + + // set flags for fast evaluation by divemode check for warnings + if ( int_O_tank_pres_need[i] == 0 ) + { + // set flag for 0 bar + int_O_tank_pres_need[i] |= INT_FLAG_ZERO; + } + else if( int_O_tank_pres_need[i] >= tank_pres_fill ) + { + // set warning flag + int_O_tank_pres_need[i] |= INT_FLAG_WARNING; + + } + else if( int_O_tank_pres_need[i] >= tank_pres_fill * GAS_NEEDS_ATTENTION_THRESHOLD ) + { + // set pre-warning flag + int_O_tank_pres_need[i] |= INT_FLAG_PREWARNING; + } + + // set invalid flag if there is an overflow in the stops table + if( char_O_deco_warnings & DECO_WARNING_STOPTABLE_OVERFLOW ) + int_O_tank_pres_need[i] |= INT_FLAG_INVALID; + + } // if( volumes[i] ) + } // for } ////////////////////////////////////////////////////////////////////////////// -// deco_calc_percentage -// -// new in v.101 -// -// calculates int_I_temp * char_I_temp / 100 -// output is int_I_temp -// -// Used to compute NoFly remaining time. -// -void deco_calc_percentage(void) -{ - RESET_C_STACK - - assert( 60 <= char_I_temp && char_I_temp <= 100 ); - assert( int_I_temp < 5760 ); // Less than 4 days = 96h... - - int_I_temp = (unsigned short)(((float)int_I_temp * (float)char_I_temp) * 0.01 ); - - assert( int_I_temp < 5760 ); // Less than 96h too... -} - -////////////////////////////////////////////////////////////////////////////// -// deco_gas_volumes -// -// new in v.111 -// -// calculates volumes for each gas. -// -// Input: char_I_bottom_depth, char_I_bottom_time for planned dive. -// Gas list. -// char_I_first_gas is the bottom gas. -// decoplan (char_O_deco_depth, char_O_deco_time). -// char_I_bottom_usage is bottom liters/minutes (5 .. 50) or bar/min. -// char_I_deco_usage is deco liters/minutes (5 .. 50) or bar/min. -// Output: int_O_gas_volumes[0..4] in litters * 0.1 -// -void deco_gas_volumes(void) + +void compute_CNS_for_display(void) { - overlay float volumes[NUM_GAS]; - overlay float bottom_usage, deco_usage; - overlay unsigned char i; - overlay unsigned char gas, depth; - overlay unsigned char lastGasStop; - RESET_C_STACK - - //---- initialize -------------------------------------------------------- - for(i=0; i<NUM_GAS; ++i) // Nothing yet... - volumes[i] = 0.0; - - bottom_usage = char_I_bottom_usage; // In liter/minutes. - deco_usage = char_I_deco_usage; // In liter/minutes. - - // Early return if not defined: - if( deco_usage <= 0.0 || bottom_usage <= 0.0 ) - goto done; - - //---- Bottom usage ----------------------------------------------------- - assert(1 <= char_I_first_gas && char_I_first_gas <= NUM_GAS); - gas = char_I_first_gas - 1; - - if( char_I_const_ppO2 == 0 ) - volumes[gas] - = (char_I_bottom_depth*0.1 + 1.0) // Use Psurface = 1.0 bar. - * char_I_bottom_time // in minutes. - * bottom_usage; // In liter/minutes. - - //---- Ascent usage ------------------------------------------------------ - depth = char_I_bottom_depth; - lastGasStop = 255; // Allow deco gas at or below bottom depth - - for(i=0; i<NUM_STOPS; ++i) - { - overlay unsigned char newDepth, time; - - time = char_O_deco_time [i]; - if( time == 0 ) break; // End of table: done. - - newDepth = char_O_deco_depth[i]; - assert(0 < newDepth && newDepth <= depth); - - //---- Any gas switch before this stop ------------------------------- - for(;;) - { - overlay unsigned char newGas = 0; - overlay unsigned char newStop = 0; // Mark as NO CHANGE yet - overlay unsigned char j; - - for(j=0; j<NUM_GAS; ++j) - { - // Skip gas without changing depth: - if( ! char_I_deco_gas_change[j] ) - continue; - // Select gas changed between [newDepth .. lastGasStop[ - // Note that <= means changing gas at BEGINNING of this stop. - // Note that < means we cant use the same gas twice - if( newDepth <= char_I_deco_gas_change[j] - && char_I_deco_gas_change[j] < lastGasStop ) - { - // Keep the DEEPEST gas in that range: - if( char_I_deco_gas_change[j] >= newStop ) - { - newGas = j; - newStop = char_I_deco_gas_change[j]; - } - } - } - - // Did we find something ? - if( !newStop ) - break; - - //---- usage BEFORE gas switch (if any), at 10m/min : - if( depth > newStop ) - // Plus usage during ascent to the next stop, at 10m/min. - volumes[gas] += ((depth+newStop)*0.05 + 1.0) // average depth --> bar. - * (depth-newStop)*0.1 // metre --> min - * deco_usage; - - //---- Do gas switch: - gas = newGas; - - lastGasStop = newStop; // Mark last used gas - if( newStop < depth ) // ascent to gas switch, - depth = newStop; - } - - // Are we back to gas from the deco list (just in case): - assert(gas == char_O_deco_gas[i]-1); - - //---- usage AFTER gas switch (if any), at 10m/min : - if( depth > newDepth ) - volumes[gas] += ((depth+newDepth)*0.05 + 1.0) // average depth --> bar. - * (depth-newDepth)*0.1 // metre --> min - * deco_usage; - - //---- Do stop: - depth = newDepth; - - //---- Usage at stop: - volumes[gas] += (depth*0.1 + 1.0) // depth --> bar. - * time // in minutes. - * deco_usage; // in xxx / min @ 1bar. - } - - // From last stop to surface - volumes[gas] += (depth*0.05 + 1.0) // avg depth --> bar. - * depth * 0.1 // time to surface, in minutes. - * deco_usage; // in xxx / min @ 1bar. - - //---- convert results for the ASM interface ----------------------------- -done: - for(i=0; i<NUM_GAS; ++i) - if( volumes[i] > 65534.0 ) - int_O_gas_volumes[i] = 65535; - else - int_O_gas_volumes[i] = (unsigned short)(volumes[i] + 0.5); + if ( CNS_fraction < 0.01 ) int_O_CNS_fraction = 0; + else if ( CNS_fraction >= 9.985 ) int_O_CNS_fraction = 999 + INT_FLAG_WARNING; + else + { + // convert float to integer + int_O_CNS_fraction = (unsigned short)(100 * CNS_fraction + 0.5); + + // compute warnings + if ( int_O_CNS_fraction >= CNS_warning_threshold ) + { + // reset pre-warning and set main warning flag + int_O_CNS_fraction &= ~INT_FLAG_PREWARNING; + int_O_CNS_fraction |= INT_FLAG_WARNING; + } + else if ( int_O_CNS_fraction >= CNS_prewarning_threshold ) + { + // reset main warning but set pre-warning flag + int_O_CNS_fraction &= ~INT_FLAG_WARNING; + int_O_CNS_fraction |= INT_FLAG_PREWARNING; + } + else + { + // clear both warnings + int_O_CNS_fraction &= ~(INT_FLAG_WARNING + INT_FLAG_PREWARNING); + } + } } ////////////////////////////////////////////////////////////////////////////// @@ -2354,10 +3772,14 @@ void deco_push_tissues_to_vault(void) { overlay unsigned char x; + RESET_C_STACK - cns_vault = CNS_fraction; - low_depth_vault = low_depth; + low_depth_norm_vault = low_depth_norm; + low_depth_alt_vault = low_depth_alt; + cns_vault_float = CNS_fraction; + cns_vault_int = int_O_CNS_fraction; + deco_warnings_vault = char_O_deco_warnings; for (x=0;x<NUM_COMP;x++) { @@ -2369,21 +3791,23 @@ void deco_pull_tissues_from_vault(void) { overlay unsigned char x; + RESET_C_STACK + low_depth_norm = low_depth_norm_vault; + low_depth_alt = low_depth_alt_vault; + CNS_fraction = cns_vault_float; + int_O_CNS_fraction = cns_vault_int; + char_O_deco_warnings = deco_warnings_vault; + + locked_GF_step_norm = GF_delta / low_depth_norm; + locked_GF_step_alt = GF_delta / low_depth_alt; + for (x=0; x<NUM_COMP; x++) { pres_tissue_N2[x] = pres_tissue_N2_vault[x]; pres_tissue_He[x] = pres_tissue_He_vault[x]; } - - // Restore both CNS variable, too. - CNS_fraction = cns_vault; - int_O_CNS_fraction = (unsigned short)(CNS_fraction * 100.0 + 0.5); - - // GF history too: - low_depth = low_depth_vault; - locked_GF_step = GF_delta / low_depth; } //////////////////////////////////////////////////////////////////////////////
--- a/src/p2_definitions.h Wed Dec 27 14:34:11 2017 +0100 +++ b/src/p2_definitions.h Wed Jan 31 19:39:37 2018 +0100 @@ -2,6 +2,8 @@ // ** Common definitions for the OSTC decompression code ** // ********************************************************* +// REFACTORED VERSION V2.95 + ////////////////////////////////////////////////////////////////////////////// // OSTC - diving computer code // Copyright (C) 2008 HeinrichsWeikamp GbR @@ -20,30 +22,26 @@ // along with this program. If not, see <http://www.gnu.org/licenses/>. // ////////////////////////////////////////////////////////////////////////////// -// history: -// 2010-12-25 v110: [jDG] split in three files (deco.c, main.c, definitions.h) -#define MBAR_REACH_GASCHANGE_AUTO_CHANGE_OFF 150 + // ************************* // ** P R O T O T Y P E S ** // ************************* -extern void calc_percentage(void); extern void deco_calc_hauptroutine(void); extern void deco_clear_tissue(void); -extern void deco_calc_percentage(void); extern void deco_calc_wo_deco_step_1_min(void); extern void deco_calc_dive_interval(void); -extern void deco_gradient_array(void); extern void deco_calc_desaturation_time(void); -extern void deco_calc_CNS_fraction(void); -extern void deco_calc_CNS_planning(void); +extern void calc_CNS_fraction(void); +extern void calc_CNS_planning(void); extern void deco_calc_CNS_decrease_15min(void); -extern void deco_clear_CNS_fraction(void); +extern void clear_CNS_fraction(void); extern void deco_push_tissues_to_vault(void); extern void deco_pull_tissues_from_vault(void); -extern void deco_gas_volumes(void); +extern void gas_volumes(void); + // *********************************************** // ** Allow compile on VisualC **
--- a/src/ports.inc Wed Dec 27 14:34:11 2017 +0100 +++ b/src/ports.inc Wed Jan 31 19:39:37 2018 +0100 @@ -19,7 +19,7 @@ #DEFINE switch_right2 PORTB,0 ; Switch #DEFINE mcp_power PORTB,2 ; RX Power supply #DEFINE s8_npower PORTB,3 ; Powers S8 Bulkhead (inverted) -#DEFINE LEDg PORTB,4 ; LED green +#DEFINE LEDg PORTB,4 ; LED green / active_reset_ostc_rx (<- Do no longer use this LED unless for debugging) #DEFINE tft_power PORTB,5 ; via P-MOSFET (Inverted) #DEFINE icsp_clk PORTB,6 ; ICSP #DEFINE icsp_dat PORTB,7 ; ICSP @@ -32,8 +32,8 @@ #DEFINE I2C_RC3 PORTC,3 ; I²C #DEFINE I2C_RC4 PORTC,4 ; I²C #DEFINE MS5541_mosi PORTC,5 ; MS5541 -#DEFINE uart1_RC6 PORTC,6 ; UART1 (USB) -#DEFINE uart1_RC7 PORTC,7 ; UART1 (USB) +#DEFINE uart1_RC6 PORTC,6 ; UART1 (USB/BLE) +#DEFINE uart1_RC7 PORTC,7 ; UART1 (USB/BLE) ; TRIS=b'10011010' ; PORTD @@ -82,7 +82,7 @@ #DEFINE CHRG_IN PORTJ,3 ; CHRG_IN #DEFINE vusb_in PORTJ,4 ; external power supply detect, USB enumerated #DEFINE power_sw1 PORTJ,5 ; Power supply for switch2 circuit -#DEFINE MS5541_clk PORTJ,6 ; MS5541 mH -#DEFINE MS5541_miso PORTJ,7 ; MS5541 mH +#DEFINE MS5541_clk PORTJ,6 ; MS5541 +#DEFINE MS5541_miso PORTJ,7 ; MS5541 ; TRIS=b'10010000'
--- a/src/rtc.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/rtc.asm Wed Jan 31 19:39:37 2018 +0100 @@ -21,9 +21,9 @@ movwf mins movlw .12 movwf hours - movlw .29 + movlw .2 movwf day - movlw .3 + movlw .12 movwf month movlw .17 movwf year
--- a/src/shared_definitions.h Wed Dec 27 14:34:11 2017 +0100 +++ b/src/shared_definitions.h Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ #ifdef xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; -; shared_definitions.h +; shared_definitions.h REFACTORED VERSION V2.95a1 ; ; Declare variables used both in C and ASM code ; @@ -67,20 +67,12 @@ #define TAB_UINT(n,size) n res 2*size #endif -#ifdef __18CXX - //---- BANK 3 DATA ------------------------------------------------------- - // Gather all data C-code --> ASM-code -# pragma udata overlay bank3=0x300 -#else -bank3 udata_ovr 0x300 -#endif - #ifdef xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Define model dimensions. NUM_COMP is the number of compartiments in the Bühlmann ZH-L16 model, ie 16. NUM_STOPS is the maximum number of stops computed by decoplanning. - Note that the deapest stop is roughly limited to 3m * NUM_STOPS + Note that the deepest stop is roughly limited to 3m * NUM_STOPS (this is assuming all stops up to the surface are used). Note also that if the table overflow, extra stops are ignored, and not reported in TTS summing. @@ -91,34 +83,64 @@ #define NUM_STOPS 0x20 #define NUM_GAS 5 -VAR_UINT (int_O_gtissue_press); -VAR_UINT (int_O_desaturation_time); // -VAR_UINT (int_O_ascenttime); // TTS (in minutes) -VAR_UINT (int_O_extra_ascenttime); // TTS for @+5min variant (in minutes) -VAR_UINT (int_O_CNS_fraction); // new in v.101 + +#ifdef __18CXX + //---- BANK 3 DATA ------------------------------------------------------- + // Gather all data C-code --> ASM-code +# pragma udata overlay bank3=0x300 +#else + ; In ASM, put the same bank, in overlay mode, at the same address +bank3 udata_ovr 0x300 +#endif + +VAR_UINT (int_O_gtissue_press); // pressure of leading compartment + +VAR_UINT (int_O_desaturation_time); // time until tissues desaturated to 5% remains, in minutes +VAR_UINT (int_O_nofly_time); // altitude / no-fly waiting time time in minutes + +VAR_UINT (int_O_ascenttime); // time-to-surface (TTS) in minutes +VAR_UINT (int_O_alternate_ascenttime); // TTS for the alternative dive plan + +VAR_UINT (int_O_CNS_fraction); // current CNS% +VAR_UINT (int_O_normal_CNS_fraction); // CNS% at end of dive in normal dive plan +VAR_UINT (int_O_alternate_CNS_fraction); // CNS% at end of dive in alternative plan + +VAR_UINT (int_O_gradient_factor); // current gradient factor in % + +VAR_UCHAR (char_O_nullzeit); // remaining NDL time in minutes +VAR_UCHAR (char_O_alternate_nullzeit); // remaining NDL time for the alternative dive plan -VAR_UCHAR (char_O_nullzeit); // -VAR_UCHAR (char_O_deco_status); // Deko state-machine state. -VAR_UCHAR (char_O_deco_last_stop); // Depth reached during deko planning. -VAR_UCHAR (char_O_gradient_factor); // -VAR_UCHAR (char_O_gtissue_no); // -VAR_UCHAR (char_O_diluent); // new in v.101 -VAR_UCHAR (char_O_flush_ppO2); // 2011-05-01: ppO2 from diluant (CCR mode). -VAR_UCHAR (char_O_EAD); // 2011-05-01: Added EAD/END in deco model. -VAR_UCHAR (char_O_END); // 2011-05-01: Added EAD/END in deco model. +VAR_UCHAR (char_O_main_status); // setup of the deco engine regarding the real tissue computations +VAR_UCHAR (char_O_deco_status); // setup of the deco engine regarding the decompression computations + +VAR_UCHAR (char_O_gtissue_no); // number of the leading compartment + +VAR_UCHAR (char_O_EAD); // equivalent air depth (EAD) of breathed gas +VAR_UCHAR (char_O_END); // equivalent narcosis depth (END) of breathed gas + +VAR_UCHAR (char_O_first_deco_depth); // depth of first stop (deco or gas change) +VAR_UCHAR (char_O_first_deco_time) ; // duration of first stop + +TAB_UCHAR (char_O_deco_depth, NUM_STOPS); // stops table: depth, ... +TAB_UCHAR (char_O_deco_time, NUM_STOPS); // ... duration, and +TAB_UCHAR (char_O_deco_gas, NUM_STOPS); // ... gas breathed -VAR_UCHAR (char_O_first_deco_depth); // Depth of first stop. -VAR_UCHAR (char_O_first_deco_time) ; // Duration of first stop. -TAB_UCHAR (char_O_deco_depth, NUM_STOPS); // Fusionned decompression table: -TAB_UCHAR (char_O_deco_time, NUM_STOPS); // Both ZH-L16 and L16-GF models. -TAB_UCHAR (char_O_deco_gas, NUM_STOPS); // Both ZH-L16 and L16-GF models. -TAB_UCHAR (char_O_deco_time_for_log, NUM_STOPS); // For logging the full decoplan +TAB_UCHAR (char_O_deco_time_for_log, NUM_STOPS); // variant of the stops table for logging purpose + +TAB_UCHAR (char_O_tissue_N2_saturation, NUM_COMP); // nitrogen tissue pressures for display purpose +TAB_UCHAR (char_O_tissue_He_saturation, NUM_COMP); // helium tissue pressures for display purpose + +VAR_UCHAR (char_O_deco_warnings); // vector of warnings generated by the deco engine -TAB_UCHAR (char_O_tissue_N2_saturation, NUM_COMP); // Nitrogen compartiment desaturation time, in min. -TAB_UCHAR (char_O_tissue_He_saturation, NUM_COMP); // Helium compartiment desaturation time, in min. +TAB_UINT (int_O_gas_volumes, NUM_GAS); // gas volumes needed in liters +TAB_UINT (int_O_tank_pres_need, NUM_GAS); // tank pressures needed in bar +VAR_UINT (int_O_ceiling); // ultimate ascent bound in mbar relative pressure -TAB_UINT (int_O_gas_volumes, 5); // Volumes evaluation for each gas tank, in 0.1 liters. -VAR_UINT (int_O_ceiling); // in mbar +VAR_UINT (int_O_O2_ppO2); // ppO2 of pure O2 at current depth +VAR_UINT (int_O_pure_ppO2); // ppO2 of the current gas or dil if breathed pure +VAR_UINT (int_O_pSCR_ppO2); // ppO2 calculated in pSCR loop +VAR_UINT (int_O_breathed_ppO2); // ppO2 actually breathed (= char_O_pure_ppO2 if in OC) + #ifdef __18CXX //---- BANK 4 DATA ------------------------------------------------------- @@ -129,42 +151,72 @@ bank4 udata_ovr 0x400 #endif -VAR_UCHAR (char_I_step_is_1min); // Use 1min integration for tissue and CNS. +VAR_UINT (int_I_pres_respiration); // absolute pressure breathed +VAR_UINT (int_I_pres_surface); // absolute pressure at surface + +VAR_UCHAR (char_I_current_gas); // number of gas currently breathed (1..5 for configured gases, 6 for the manual gas) +VAR_UCHAR (char_I_He_ratio); // helium ratio of the currently breathed gas +VAR_UCHAR (char_I_O2_ratio); // oxygen ratio of the currently breathed gas + +VAR_UCHAR (char_I_saturation_multiplier); // safety factor, 100 = no conservatism, 150 = 50% faster saturation +VAR_UCHAR (char_I_desaturation_multiplier);// safety factor, 100 = no conservatism, 66 = 50% slower desaturation + +VAR_UCHAR (char_I_GF_High_percentage); // GF model high value +VAR_UCHAR (char_I_GF_Low_percentage); // GF model low value + +VAR_UCHAR (char_I_deco_distance); // assumed extra depth below required depth for CNS and gas volumes calculations +VAR_UCHAR (char_I_depth_last_deco); // depth of the last deco stop in meters + +VAR_UCHAR (char_I_deco_model); // deco model selection: 0 = ZH-L16, 1 = ZH-L16-GF (with gradient factors) + +VAR_UCHAR (char_I_bottom_depth); // bottom depth, used for gas volume calculations +VAR_UCHAR (char_I_bottom_time); // bottom time, used for gas volume calculations + +VAR_UCHAR (char_I_dive_interval); // duration of surface break before next dive in minutes, used in simulation +VAR_UCHAR (char_I_sim_advance_time); // 'fast forward' of dive time, used in simulation (+5 min function) + +VAR_UCHAR (char_I_const_ppO2); // ppO2 reported from sensors or by setpoint + +TAB_UCHAR (char_I_deco_gas_change,NUM_GAS); // change depths of the OC gases +TAB_UCHAR (char_I_dil_change, NUM_GAS); // change depths of the diluent gases. Attention: must be placed after char_I_deco_gas_change! Remark: not used by C code, only by ASM code + +TAB_UCHAR (char_I_setpoint_change,NUM_GAS); // change depth for the setpoints in meter +TAB_UCHAR (char_I_setpoint_cbar, NUM_GAS); // setpoints in cbar + +TAB_UCHAR (char_I_deco_O2_ratio, NUM_GAS); // oxygen ratios of the configured gases, used for deco calculations +TAB_UCHAR (char_I_deco_He_ratio, NUM_GAS); // helium ratios of the configured gases, used for deco calculations -VAR_UINT (int_I_pres_respiration); // -VAR_UINT (int_I_pres_surface); // -VAR_UINT (int_I_temp); // new in v101 -VAR_UINT (int_I_divemins); // Dive time (minutes) -VAR_UCHAR (char_I_temp); // new in v101 -VAR_UCHAR (char_I_actual_ppO2); // -VAR_UCHAR (char_I_first_gas); // Gas used at start of dive (bottom mix) -VAR_UCHAR (char_I_current_gas); // Current gas breathed (1..6). -VAR_UCHAR (char_I_N2_ratio); // -VAR_UCHAR (char_I_He_ratio); // -VAR_UCHAR (char_I_O2_ratio); // -VAR_UCHAR (char_I_saturation_multiplier); // for conservatism/safety values 1.0 no conservatism to 1.5 50% faster saturation -VAR_UCHAR (char_I_desaturation_multiplier);// for conservatism/safety values 0.66 50% slower desaturation to 1.0 no conservatism// consveratism used in calc_tissue , calc_tissue_step_1_min and sim_tissue_1min -VAR_UCHAR (char_I_GF_High_percentage); // new in v.102 -VAR_UCHAR (char_I_GF_Low_percentage); // new in v.102 -VAR_UCHAR (char_I_deco_distance); // -VAR_UCHAR (char_I_depth_last_deco); // new in v.101 unit: [m] -VAR_UCHAR (char_I_deco_model); // new in v.102. 0 == ZH-L16, 1 = ZH-L16-GF (Gradiant factor) -VAR_UCHAR (char_I_bottom_depth); // Bottom depth for planning (used in gas volume evaluation). -VAR_UCHAR (char_I_bottom_time); // Bottom time for planning (used in gas volume evaluation). -VAR_UCHAR (char_I_dive_interval); // Delay before next dive simulation. -VAR_UCHAR (char_I_const_ppO2); // new in v.101 +TAB_UCHAR (char_I_tank_size, NUM_GAS); // tank sizes, used for pressure needs calculation +TAB_UCHAR (char_I_tank_pres_fill, NUM_GAS); // tank fill pressures, used for generating warnings + +VAR_UCHAR (char_I_cc_max_frac_o2); // limiter for maximum O2% in loop +VAR_UCHAR (char_I_PSCR_drop); // pSCR parameter drop [%] +VAR_UCHAR (char_I_PSCR_lungratio); // pSCR parameter lung ratio [1/x] + +VAR_UCHAR (char_I_altitude_wait); // selector for altitude / no-fly waiting time calculation + +VAR_UCHAR (char_I_bottom_usage); // gas consumption during bottom part and initial ascent in liters/minute +VAR_UCHAR (char_I_deco_usage); // gas consumption during deco stops and following ascents in liters/minute + +VAR_UCHAR (char_I_extra_time); // extra bottom time for fTTs and delayed ascent calculation in minutes -TAB_UCHAR (char_I_deco_gas_change,NUM_GAS); // new in v.101 -TAB_UCHAR (char_I_dil_change,NUM_GAS); // Must be placed after char_I_deco_gas_change! +VAR_UCHAR (char_I_ppO2_max); // warning threshold for maximum ppO2 during working phase of the dive +VAR_UCHAR (char_I_ppO2_max_deco); // warning threshold for maximum ppO2 during deco phase of the dive +VAR_UCHAR (char_I_ppO2_min); // warning threshold for maximum ppO2 when breathing OC +VAR_UCHAR (char_I_ppO2_min_loop); // warning threshold for maximum ppO2 when breathing from CCR or pSCR -TAB_UCHAR (char_I_setpoint_change,NUM_GAS); // Change depths in m -TAB_UCHAR (char_I_deco_N2_ratio, NUM_GAS); // new in v.101 -TAB_UCHAR (char_I_deco_He_ratio, NUM_GAS); // new in v.101 +VAR_UCHAR (char_I_ascent_speed); // ascent speed in meters/minute +VAR_UCHAR (char_I_gas_change_time); // extra time spent during a stop for doing a gas change, in minutes + -TAB_UCHAR (char_I_setpoint_cbar,NUM_GAS); // Setpoints in cbar - -VAR_UCHAR (char_I_bottom_usage); // [l/min] -VAR_UCHAR (char_I_deco_usage); // [l/min] - -VAR_UCHAR (char_I_extra_time); // [min] -VAR_UCHAR (temp_bankx400); // temp +#ifdef xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +// VAR_UCHAR (char_I_step_is_1min); // Use 1min integration for tissue and CNS. DELETED ## V2.95 - made local to p2_deco.c +// VAR_UINT (int_I_temp); // new in v101 DELETED ## no fly +// VAR_UINT (int_I_divemins); // Dive time (minutes) DELETED ## V2.95 - not used by p2_deco.c +// VAR_UCHAR (char_I_temp); // new in v101 DELETED ## no fly +// VAR_UCHAR (char_I_actual_ppO2); // DELETED ## V2.94 +// VAR_UCHAR (char_I_first_gas); // Gas used at start of dive (bottom mix) DELETED ## V2.95 - made local to p2_deco.c +// VAR_UCHAR (char_I_N2_ratio); // N2 ratio of the currently breathed gas DELETED ## V2.95 - not read from ASM, but actually computed by p2_deco.c from H2 and O2 ratio +// VAR_UCHAR (char_O_deco_last_stop); // Depth reached during deco planning. DELETED ## V2.95 - not used in ASM +// VAR_UCHAR (temp_bankx400); // reserved space for temporary variables +#endif
--- a/src/simulator.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/simulator.asm Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File simulator.asm +; File simulator.asm REFACTORED VERSION V2.95a1 ; ; Decoplan interface to C model code. ; @@ -9,7 +9,7 @@ ; HISTORY ; 2011-07-09 : [jDG] Creation... -#include "hwos.inc" ; Mandatory include. +#include "hwos.inc" ; Mandatory include #include "convert.inc" ; output_* #include "shared_definitions.h" ; Mailbox from/to p2_deco.c #include "strings.inc" ; STRCPY,... @@ -28,335 +28,152 @@ extern deco_push_tissues_to_vault extern deco_calc_dive_interval extern deco_calc_hauptroutine - extern deco_calc_tissue - extern deco_calc_CNS_fraction - extern deco_calc_CNS_planning extern deco_pull_tissues_from_vault extern TFT_display_decotype_surface1 + extern get_first_dil_to_WREG + extern get_first_gas_to_WREG + extern setup_dil_registers + extern setup_gas_registers + extern deco_setup_cc_diluents + extern deco_setup_oc_gases + extern log_screendump_and_onesecond, logbook_preloop_tasks extern do_planner_menu ;---- Private temp variables ------------------------------------------------- - CBLOCK tmp+0x12 ; Reserved space for wordprocessor and convert - decoplan_index ; within each page - decoplan_gindex ; global index - decoplan_last ; Depth of last stop (CF#29) - decoplan_flags ; Various private flags. - decoplan_CNS:2 ; Backup CNS before vault restore - decoplan_page ; page number - ; Reserved to tmp+0x18... - ENDC -#define decoplan_last_ceiling_shown decoplan_flags,0 -;---- Demo decoplanner ------------------------------------------------------- - global do_demo_planner + CBLOCK tmp+0x12 ; Reserved space for word processor and convert + decoplan_index ; within each page + decoplan_gindex ; global index + decoplan_last ; Depth of last stop (CF#29) + decoplan_flags ; Various private flags. + decoplan_page ; page number + decoplan_warnings ; deco engine warnings (ex reserved to tmp+0x18...) + ENDC + +;---- Defines ---------------------------------------------------------------- + +#define decoplan_last_ceiling_shown decoplan_flags,0 +#define decoplan_abort decoplan_flags,1 + +;---- Demo deco planner ------------------------------------------------------ + global do_demo_planner do_demo_planner: - btfsc FLAG_gauge_mode ; =1: In Gauge mode - goto do_planner_menu - btfsc FLAG_apnoe_mode ; =1: In Apnea mode - goto do_planner_menu -; call deco_reset ; TODO: remove reset all Decodata - rcall deco_planer - rcall deco_show_plan - goto do_planner_menu - -;============================================================================= -; Pass all parameters to the C code -; + btfsc FLAG_gauge_mode ; =1: In Gauge mode + goto do_planner_menu + btfsc FLAG_apnoe_mode ; =1: In Apnea mode + goto do_planner_menu + bcf decoplan_abort ; initialize (clear) abort flag + bcf is_bailout ; clear bailout condition (may have remained set from last invocation) + rcall deco_planer + btfss decoplan_abort ; skip recall deco_show_plan if calculations were aborted + rcall deco_show_plan + goto do_planner_menu - global get_first_dil_to_WREG -get_first_dil_to_WREG: ; Gets first dil (0-4) into WREG - lfsr FSR1,opt_dil_type ; Point to dil types - clrf lo ; start with Gas0 -get_first_dil_to_WREG2: - movf lo,W ; - movf PLUSW1,W ; Get Type of Dil #lo - sublw .1 ; it is = 1 (First Dil) - bz get_first_dil_to_WREG3 ; Found the first dil! - incf lo,F ; ++ - movlw NUM_GAS+1 - cpfseq lo ; All done? - bra get_first_dil_to_WREG2 ; Not yet - ; No first dil found, use #1 - movlw .0 - movff WREG,opt_dil_type+0 ; Set Dil1 to First - return -get_first_dil_to_WREG3: - movf lo,W ; Put into Wreg - return ; Done - global get_first_gas_to_WREG -get_first_gas_to_WREG: ; Gets first gas (0-4) into WREG - lfsr FSR1,opt_gas_type ; Point to gas types - clrf lo ; start with Gas0 -get_first_gas_to_WREG2: - movf lo,W ; - movf PLUSW1,W ; Get Type of Gas #lo - sublw .1 ; it is = 1 (First Gas) - bz get_first_gas_to_WREG3 ; Found the first gas! - incf lo,F ; ++ - movlw NUM_GAS+1 - cpfseq lo ; All done? - bra get_first_gas_to_WREG2 ; Not yet - ; No first gas found, use #1 - movlw .0 - movff WREG,opt_gas_type+0 ; Set Gas1 to First - return -get_first_gas_to_WREG3: - movf lo,W ; Put into Wreg - return ; Done - + global deco_setup deco_setup: - banksel char_I_step_is_1min ; Select the right bank... - clrf char_I_step_is_1min ; Default to 2sec steps. - - ; Fixed ambient surface pressure to 1bar. - movlw LOW(.1000) - movwf int_I_pres_surface+0 - movwf int_I_pres_respiration+0 - movlw HIGH(.1000) - movwf int_I_pres_surface+1 - movwf int_I_pres_respiration+1 - - clrf int_I_divemins+0 ; Dive start - clrf int_I_divemins+1 + banksel common + btfsc FLAG_ccr_mode + bra deco_setup_cc + btfsc FLAG_pscr_mode + bra deco_setup_cc +deco_setup_oc: + call get_first_gas_to_WREG ; gets first gas (1-5) into WREG + call setup_gas_registers ; with WREG=Gas 1-5 + call deco_setup_oc_gases ; setup OC/Bailout Gases and configure for OC deco calculation + bra deco_setup_cont +deco_setup_cc: + call get_first_dil_to_WREG ; gets first gas (1-5) into WREG + call setup_dil_registers ; with WREG=Gas 1-5 + call deco_setup_cc_diluents ; setup CCR/pSCR diluents and configure for CCR/pSCR deco calculation +deco_setup_cont: + ; use ambient conditions for simulation ## V2.94 + #include "isr.inc" + SAFE_2BYTE_COPY last_surfpressure_30min, int_I_pres_surface ; copy surface pressure to deco routine - banksel common ; Bank1 - bcf use_agf ; =1: Use aGF - - rcall deco_setup_dive - - movlw .0 ; Bank safe "clrf" - movff WREG,char_I_const_ppO2 ; deactivate CCR-mode in deco calculations unless in CCR mode (char_I_const_ppO2 is filled below again) - - ; Setup char_I_const_ppO2 for CC modes - btfsc FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active - movff char_I_setpoint_cbar+0,char_I_const_ppO2 ; Setup fixed Setpoint (Always start with SP1) - rcall get_first_gas_to_WREG ; Gets first gas (0-4) into WREG - - ; Overwrite WREG in CCR and PSCR Mode - btfsc FLAG_ccr_mode - rcall get_first_dil_to_WREG - btfsc FLAG_pscr_mode - rcall get_first_dil_to_WREG - - incf WREG ; 1-5 - movff WREG,char_I_first_gas ; Copy for compatibility - decf WREG ; 0-4 - extern setup_gas_registers - call setup_gas_registers ; With WREG=Gas 0-4, set current N2/He/O2 ratios. - extern set_actual_ppo2 - goto set_actual_ppo2 ; Then configure char_I_actual_ppO2 (For CNS) (And return!) - - global deco_setup_dive -deco_setup_dive: ; Called from divemode - banksel common ; Bank1 - - btfsc is_bailout - bra deco_setup_dive_oc - btfsc FLAG_ccr_mode - bra deco_setup_dive_cc - btfsc FLAG_pscr_mode - bra deco_setup_dive_cc - -deco_setup_dive_oc: - rcall deco_setup_oc_gases ; Setup OC/Bailout Gases - bra deco_setup_dive_cont -deco_setup_dive_cc: - rcall deco_setup_cc_diluents ; Setup CC Diluents -deco_setup_dive_cont: - - movff divemins+0,int_I_divemins+0 ; Current dive time. - movff divemins+1,int_I_divemins+1 - - movlw deco_distance - movff WREG,char_I_deco_distance - movff opt_last_stop,char_I_depth_last_deco - movff opt_GF_low,char_I_GF_Low_percentage - movff opt_GF_high,char_I_GF_High_percentage - ;Overwrite GF if aGF is wanted - btfsc use_agf ; =1: Use aGF - movff opt_aGF_low,char_I_GF_Low_percentage - btfsc use_agf ; =1: Use aGF - movff opt_aGF_high,char_I_GF_High_percentage - return - -deco_setup_cc_diluents: - movff opt_dil_He_ratio+0,char_I_deco_He_ratio+0 - movff char_I_deco_He_ratio+0,lo - movff opt_dil_O2_ratio+0,WREG - addwf lo,W ; O2 + He -> WREG - sublw .100 ; 100 - (O2 + He) -> WREG - movff WREG,char_I_deco_N2_ratio+0 - movff opt_dil_type+0,WREG ; 0=Disabled, 1=First, 2=Normal - tstfsz WREG ; Disabled? - bra $+4 ; No - movff WREG,char_I_dil_change+0 ; Yes, clear char_I_deco_gas_change (Bank safe) + movlw deco_distance + movff WREG,char_I_deco_distance - movff opt_dil_He_ratio+1,char_I_deco_He_ratio+1 - movff char_I_deco_He_ratio+1,lo - movff opt_dil_O2_ratio+1,WREG - addwf lo,W ; O2 + He -> WREG - sublw .100 ; 100 - (O2 + He) -> WREG - movff WREG,char_I_deco_N2_ratio+1 - movff opt_dil_type+1,WREG ; 0=Disabled, 1=First, 2=Normal - tstfsz WREG ; Disabled? - bra $+4 ; No - movff WREG,char_I_dil_change+1 ; Yes, clear char_I_dil_change - - movff opt_dil_He_ratio+2,char_I_deco_He_ratio+2 - movff char_I_deco_He_ratio+2,lo - movff opt_dil_O2_ratio+2,WREG - addwf lo,W ; O2 + He -> WREG - sublw .100 ; 100 - (O2 + He) -> WREG - movff WREG,char_I_deco_N2_ratio+2 - movff opt_dil_type+2,WREG ; 0=Disabled, 1=First, 2=Normal - tstfsz WREG ; Disabled? - bra $+4 ; No - movff WREG,char_I_dil_change+2 ; Yes, clear char_I_dil_change + movff opt_last_stop,char_I_depth_last_deco + movff opt_GF_low,char_I_GF_Low_percentage + movff opt_GF_high,char_I_GF_High_percentage + + ; overwrite GF if aGF is wanted + bsf use_agf + TSTOSS opt_sim_use_aGF + bcf use_agf - movff opt_dil_He_ratio+3,char_I_deco_He_ratio+3 - movff char_I_deco_He_ratio+3,lo - movff opt_dil_O2_ratio+3,WREG - addwf lo,W ; O2 + He -> WREG - sublw .100 ; 100 - (O2 + He) -> WREG - movff WREG,char_I_deco_N2_ratio+3 - movff opt_dil_type+3,WREG ; 0=Disabled, 1=First, 2=Normal - tstfsz WREG ; Disabled? - bra $+4 ; No - movff WREG,char_I_dil_change+3 ; Yes, clear char_I_dil_change - - movff opt_dil_He_ratio+4,char_I_deco_He_ratio+4 - movff char_I_deco_He_ratio+4,lo - movff opt_dil_O2_ratio+4,WREG - addwf lo,W ; O2 + He -> WREG - sublw .100 ; 100 - (O2 + He) -> WREG - movff WREG,char_I_deco_N2_ratio+4 - movff opt_dil_type+4,WREG ; 0=Disabled, 1=First, 2=Normal - tstfsz WREG ; Disabled? - bra $+4 ; No - movff WREG,char_I_dil_change+4 ; Yes, clear char_I_dil_change - - ; Setup char_I_deco_gas_change array - movff char_I_dil_change+0, char_I_deco_gas_change+0 - movff char_I_dil_change+1, char_I_deco_gas_change+1 - movff char_I_dil_change+2, char_I_deco_gas_change+2 - movff char_I_dil_change+3, char_I_deco_gas_change+3 - movff char_I_dil_change+4, char_I_deco_gas_change+4 - return - -deco_setup_oc_gases: - movff opt_gas_He_ratio+0,char_I_deco_He_ratio+0 - movff char_I_deco_He_ratio+0,lo - movff opt_gas_O2_ratio+0,WREG - addwf lo,W ; O2 + He -> WREG - sublw .100 ; 100 - (O2 + He) -> WREG - movff WREG,char_I_deco_N2_ratio+0 - banksel opt_gas_type+0 - movlw .3 ; 3=Deco - cpfseq opt_gas_type+0 ; Gas is deco type? - clrf opt_OC_bail_gas_change+0 ; No, clear depth for 0=Disabled, 1=First and 2=Travel - banksel common + btfsc use_agf ; =1: Use aGF + movff opt_aGF_low,char_I_GF_Low_percentage + btfsc use_agf ; =1: Use aGF + movff opt_aGF_high,char_I_GF_High_percentage - movff opt_gas_He_ratio+1,char_I_deco_He_ratio+1 - movff char_I_deco_He_ratio+1,lo - movff opt_gas_O2_ratio+1,WREG - addwf lo,W ; O2 + He -> WREG - sublw .100 ; 100 - (O2 + He) -> WREG - movff WREG,char_I_deco_N2_ratio+1 - banksel opt_gas_type+1 - movlw .3 ; 3=Deco - cpfseq opt_gas_type+1 ; Gas is deco type? - clrf opt_OC_bail_gas_change+1 ; No, clear depth for 0=Disabled, 1=First and 2=Travel - banksel common - - movff opt_gas_He_ratio+2,char_I_deco_He_ratio+2 - movff char_I_deco_He_ratio+2,lo - movff opt_gas_O2_ratio+2,WREG - addwf lo,W ; O2 + He -> WREG - sublw .100 ; 100 - (O2 + He) -> WREG - movff WREG,char_I_deco_N2_ratio+2 - banksel opt_gas_type+2 - movlw .3 ; 3=Deco - cpfseq opt_gas_type+2 ; Gas is deco type? - clrf opt_OC_bail_gas_change+2 ; No, clear depth for 0=Disabled, 1=First and 2=Travel - banksel common - - movff opt_gas_He_ratio+3,char_I_deco_He_ratio+3 - movff char_I_deco_He_ratio+3,lo - movff opt_gas_O2_ratio+3,WREG - addwf lo,W ; O2 + He -> WREG - sublw .100 ; 100 - (O2 + He) -> WREG - movff WREG,char_I_deco_N2_ratio+3 - banksel opt_gas_type+3 - movlw .3 ; 3=Deco - cpfseq opt_gas_type+3 ; Gas is deco type? - clrf opt_OC_bail_gas_change+3 ; No, clear depth for 0=Disabled, 1=First and 2=Travel - banksel common - - movff opt_gas_He_ratio+4,char_I_deco_He_ratio+4 - movff char_I_deco_He_ratio+4,lo - movff opt_gas_O2_ratio+4,WREG - addwf lo,W ; O2 + He -> WREG - sublw .100 ; 100 - (O2 + He) -> WREG - movff WREG,char_I_deco_N2_ratio+4 - banksel opt_gas_type+4 - movlw .3 ; 3=Deco - cpfseq opt_gas_type+4 ; Gas is deco type? - clrf opt_OC_bail_gas_change+4 ; No, clear depth for 0=Disabled, 1=First and 2=Travel - banksel common - - movlw .0 - movff WREG,char_I_const_ppO2 ; Clear constant ppO2 for OC/bailout - - ; Setup char_I_deco_gas_change array - movff opt_OC_bail_gas_change+0, char_I_deco_gas_change+0 - movff opt_OC_bail_gas_change+1, char_I_deco_gas_change+1 - movff opt_OC_bail_gas_change+2, char_I_deco_gas_change+2 - movff opt_OC_bail_gas_change+3, char_I_deco_gas_change+3 - movff opt_OC_bail_gas_change+4, char_I_deco_gas_change+4 - return - + bcf is_bailout + + ; setup char_I_const_ppO2 for CC modes + clrf WREG + btfsc FLAG_pscr_mode + movff WREG,char_I_const_ppO2 ; configure pSCR computations to calculated ppO2 + btfss FLAG_ccr_mode + return ; done if not in CCR mode + movff opt_sim_setpoint_number,WREG ; configure CCR computations to selected setpoint + decf WREG,W ; 1-5 -> 0-4 + lfsr FSR1,char_I_setpoint_cbar ; load base address of setpoint list + movff PLUSW1,char_I_const_ppO2 ; setup setpoint + return + ;============================================================================= -; Reset decompression tissues +; Launch deco planning ; - global deco_reset -deco_reset: - rcall deco_setup ; Setup all model parameters. - call deco_clear_tissue ; Set all tissues to Pamb * N2_ratio - call deco_clear_CNS_fraction ; Reset CNS value. - banksel common ; Bank1 - return - -;============================================================================= -; Launch decoplanning -; - global deco_planer + global deco_planer deco_planer: - call speed_fastest ; Quick ! - rcall deco_setup ; Setup all model parameters. - call deco_push_tissues_to_vault - banksel common ; Bank1 + call speed_fastest ; Quick ! + call deco_push_tissues_to_vault + rcall deco_setup ; Setup all model parameters. ;---- Specific settings ------------------------------------------------------ + + ; configure the deco engine for normal plan, CNS & gas volume calculation and no delayed ascent + movff char_O_deco_status,WREG ; bank-safe copy + bcf WREG,DECO_PLAN_FLAG ; normal plan mode, + bsf WREG,DECO_CNS_FLAG ; enable CNS calculation (CNS at end of dive), + bsf WREG,DECO_VOLUME_FLAG ; enable gas volume calculation, and + bcf WREG,DECO_ASCENT_FLAG ; disable delayed ascent calculation + movff WREG,char_O_deco_status ; bank-safe copy back + + ; configure the deco engine for total-dive gas volume calculation + movff char_O_main_status,WREG ; bank-safe copy + bsf WREG,DECO_BOTTOM_FLAG ; set bottom flag + movff WREG,char_O_main_status ; bank-safe copy back + deco_planer_redo: - banksel char_O_deco_status ; Bank 2 - movlw .3 ; Start in surface state. - movwf char_O_deco_status - - banksel char_I_step_is_1min ; Bank 3 - movlw 1 - movwf char_I_step_is_1min ; Set 1min steps + + ; show deco calculation is in progress + call TFT_ClearScreen + WIN_COLOR color_greenish + TEXT_SMALL .20,.40, tCalculating + WIN_COLOR color_lightblue + WIN_SMALL .1,.215 + STRCPY_TEXT_PRINT tAbort + + ; configure the deco engine for restart: + movff char_O_deco_status,WREG ; bank-safe copy + bsf WREG,DECO_STATUS_0_FLAG ; configure init ... + bsf WREG,DECO_STATUS_1_FLAG ; ... state, + movff WREG,char_O_deco_status ; bank-safe copy back ;---- Add delay at surface, if needed ---------------------------------------- + + banksel char_I_dive_interval tstfsz char_I_dive_interval call deco_calc_dive_interval ;---- Dive loop -------------------------------------------------------------- - ; Compute dive ambiant conditions + ; Compute dive ambient conditions banksel char_I_bottom_depth movf char_I_bottom_depth,W mullw .100 @@ -366,90 +183,94 @@ movlw HIGH(.1000) addwfc PRODH,W movwf int_I_pres_respiration+1 + + banksel common - banksel int_I_divemins ; Bank 4 - clrf int_I_divemins+0 ; Clear dive time - clrf int_I_divemins+1 + movff char_I_bottom_time,char_I_sim_advance_time + + clrf TMR5L + clrf TMR5H ; 30,51757813µs/bit in TMR5L:TMR5H - clrf TMR5L - clrf TMR5H ; 30,51757813µs/bit in TMR5L:TMR5H - call deco_calc_hauptroutine ; Reset + simulate first min. + call deco_calc_hauptroutine ; initialization + complete bottom time part + banksel common + +;---- BAILOUT: Switch to OC gases for ascent cycles -------------------------- -deco_planer_loop: - banksel int_I_divemins ; Bank 3 - incf int_I_divemins,F ; Done 1 min. - btg LEDg - - movf char_I_bottom_time,W ; Finished ? - xorwf int_I_divemins,W - bz deco_planer_endloop ; YES + btfss is_bailout ; Doing a bailout deco plan ? + bra deco_planer_finishing ; NO - keep gases + ; YES - switch to OC gas - call deco_calc_tissue ; JUST calc tissue (faster). - call deco_calc_CNS_fraction ; Also calculate CNS (in 1min loop) - bra deco_planer_loop + ; reconfigure the deco engine for delayed ascent mode + movff char_O_deco_status,lo ; bank-safe copy + bsf lo,DECO_ASCENT_FLAG ; set flag for delayed ascent calculation + movff lo,char_O_deco_status ; bank-safe copy back + + ; configure the deco engine for delayed ascent part gas volume calculation + movff char_O_main_status,WREG ; bank-safe copy + bcf WREG,DECO_BOTTOM_FLAG ; set bottom flag + movff WREG,char_O_main_status ; bank-safe copy back -deco_planer_endloop: - banksel char_I_step_is_1min - clrf char_I_step_is_1min ; Back to 2sec loops + ; reconfigure gas settings to OC gases + call get_first_gas_to_WREG ; get first gas (1-5) into WREG + call setup_gas_registers ; With WREG=Gas 1-5 (or 6, not applicable here) + call deco_setup_oc_gases ; With WREG=Gas 1-5 (or 6, not applicable here) + + ; set the gas change override flag to allow gas changes before deco stops as done in alternative plan + movff char_O_main_status,lo ; bank-safe copy + bsf lo,DECO_GASCHANGE_OVRD ; set flag for gas change override + movff lo,char_O_main_status ; bank-safe copy back + +;---- Wait until status reaches zero ------------------------------------------- -;---- BAILOUT: Switch to OC gases for ascent cycles -------------------------- - banksel common - btfss is_bailout ; Doing a bailout decoplan ? - bra deco_planer_finishing ; NO: keep gases - - rcall deco_setup_oc_gases ; Switch to OC gas and no const_ppO2 - - movlw .0 - movff WREG,char_I_const_ppO2 ; deactivate CCR-mode deco calculations - -;---- Wait until status reach zero ------------------------------------------- deco_planer_finishing: - btg LEDg -; clrf TMR5L -; clrf TMR5H ; 30,51757813µs/bit in TMR5L:TMR5H - call deco_calc_hauptroutine ; Simulate 2sec more - - banksel char_O_deco_status ; Bank 2 - movf char_O_deco_status,W - bnz deco_planer_finishing + call deco_calc_hauptroutine ; Simulate more dive time to trigger the deco calculations + banksel common + + btfss switch_left ; check if left button was pressed + bra deco_planer_finishing_1 ; NO - continue calculations + bsf decoplan_abort ; YES - set abort flag so that deco_show_plan will not be called + bra deco_planer_finishing_2 ; do some clean-up and return +deco_planer_finishing_1: + movff char_O_deco_status,lo ; working copy of char_O_deco_status in bank common + movlw DECO_STATUS_MASK ; bit mask for deco status bit set + andwf lo,W ; mask out bits showing state of computation + tstfsz WREG ; check if a compute cycle is finished (bits 1 and 0 == 0) + bra deco_planer_finishing ; NO - needs more computation cycles ;---- Done: add CNS from decoplan, and restore tissues - call deco_calc_CNS_planning - movff int_O_CNS_fraction+0,decoplan_CNS+0 - movff int_O_CNS_fraction+1,decoplan_CNS+1 - call deco_pull_tissues_from_vault - bcf LEDg - banksel common ; Bank1 - movlw b'00111000' ; 1:8 Prescaler -> 65,536ms@16MHz - movwf T3CON - call speed_normal - return + +deco_planer_finishing_2: + + movff char_O_deco_warnings,decoplan_warnings ; copy warnings + + call deco_pull_tissues_from_vault ; restore "real" deco data + banksel common ; back to bank 1 + + movlw b'00111000' ; 1:8 Prescaler -> 65,536ms@16MHz + movwf T3CON + goto speed_normal ;(and return) ;----------------------------------------------------------------------------- ; Draw a stop of the deco plan (simulator or dive). ; Inputs: lo = depth. Range 3m...93m -; + 80 if this is a switch-gas stop. +; + 0x80 if this is a switch-gas stop. ; up = minutes. range 1'..240'. ; win_top = line to draw on screen. ; Trashed: up, lo, win_height, win_leftx2, win_width, win_color*, ; WREG, PROD, TBLPTR TABLAT. ; deco_plan_show_stop: - ;---- Print depth ---------------------------------------------------- - btfss lo,7 ; Bit set ? - bra deco_plan_show_std_stop ; No : Just an usual stop. - call TFT_attention_color - bcf lo,7 ; and cleanup depth. - bra deco_plan_show_nstd_stop + ;---- Print depth ---------------------------------------------------- + bcf lo,7 ; clear gas-switch flag (not used any more anyhow) + lfsr FSR2,char_O_deco_gas + movf decoplan_gindex,W ; index + movff PLUSW2,WREG ; get current gas + rcall simulator_color_gas ; set output color dependent on gas (1-5) -deco_plan_show_std_stop: - call TFT_standard_color - -deco_plan_show_nstd_stop: lfsr FSR2,buffer - TSTOSS opt_units ; 0=Meters, 1=Feets + TSTOSS opt_units ; 0=Meters, 1=Feets bra deco_plan_show_nstd_stop_metric WIN_LEFT .85 @@ -457,7 +278,7 @@ mullw .100 ; PRODL:PRODH = mbar movff PRODL,lo movff PRODH,hi -; Convert with 334feet/100m to have 10ft, 20ft, 30ft stops... + ; Convert with 334feet/100m to have 10ft, 20ft, 30ft stops... movff lo,xA+0 movff hi,xA+1 movlw LOW d'334' ; 334feet/100m @@ -480,6 +301,7 @@ bsf leftbind bsf ignore_digit4 ; Only full feet output_16 + bcf leftbind STRCAT_PRINT "ft " bra deco_plan_show_nstd_stop_common @@ -487,6 +309,7 @@ WIN_LEFT .90 bsf leftbind output_8 ; outputs into Postinc2! + bcf leftbind STRCAT_PRINT "m " deco_plan_show_nstd_stop_common: ;---- Print duration ------------------------------------------------- @@ -508,7 +331,7 @@ movwf up ;--------------------------------------------------------------------- - ; Draw the bar graph used for deco stops (decoplan in simulator or dive). + ; Draw the bar graph used for deco stops (deco plan in simulator or dive). incf win_top,F movlw .19 movwf win_height @@ -516,7 +339,7 @@ movwf win_leftx2 ; column left (0-159) movlw .16 movwf win_width+0 ; column max width. - clrf win_width+1 + clrf win_width+1 ; Draw used area (up = minutes): movlw .16 ; Limit length (16min) @@ -531,25 +354,25 @@ return ;----------------------------------------------------------------------------- -; Clear unused area belw last stop +; Clear unused area below last stop ; Inputs: win_top : last used area... deco_plan_show_clear_bottom: movf win_top,W ; Get back from bank0 sublw .239 ; No: bottom row in planning movwf win_height - WIN_LEFT .85 ; Full divemenu width + WIN_LEFT .85 ; Full dive menu width movlw .159-.85+1 movwf win_width+0 - clrf win_width+1 + clrf win_width+1 clrf win_color1 ; Fill with black clrf win_color2 - goto TFT_box ; and return + goto TFT_box ; and return ;----------------------------------------------------------------------------- -; Display the decoplan (simulator). +; Display the deco plan (simulator). ; Inputs: char_O_deco_table (array of stop times, in minutes) ; decoplan_page = page number. ; @@ -576,7 +399,7 @@ ; Read stop parameters, indexed by decoplan_index and decoplan_page movf decoplan_page,W ; decoplan_gindex = 6*decoplan_page + decoplan_index - mullw .8 ; 8 lines/page in decoplan + mullw .8 ; 8 lines/page in deco plan movf decoplan_index,W addwf PRODL,W movwf decoplan_gindex ; --> decoplan_gindex @@ -599,19 +422,19 @@ ; Next movlw .24 - addwf win_top,F ; row: += 24 - incf decoplan_index,F ; local index += 1 - incf decoplan_gindex,F ; global index += 1 + addwf win_top,F ; row: += 24 + incf decoplan_index,F ; local index += 1 + incf decoplan_gindex,F ; global index += 1 ; Max number of lines/page reached ? - movlw .8 ; 8 lines/page in decoplan + movlw .8 ; 8 lines/page in deco plan cpfseq decoplan_index - bra deco_plan_show_2 ; NO: loop + bra deco_plan_show_2 ; NO: loop - ; Check if next stop if end-of-list ? + ; Check if next stop is end-of-list ? movf decoplan_gindex,W - movf PLUSW0,W ; char_O_deco_depth[gindex] - bz deco_plan_show_99 ; End of list... + movf PLUSW0,W ; char_O_deco_depth[gindex] + bz deco_plan_show_99 ; End of list... ; Display the message "more..." rcall deco_plan_show_clear_bottom ; Clear from next line @@ -626,33 +449,35 @@ return ;----------------------------------------------------------------------------- -; Loop to show all pages of the decoplan (surfacemode) +; Loop to show all pages of the deco plan (surface mode) global deco_show_plan deco_show_plan: clrf decoplan_page call TFT_ClearScreen WIN_COLOR color_greenish - btfsc is_bailout - bra deco_show_plan_bail_title + btfsc is_bailout + bra deco_show_plan_bail_title TEXT_SMALL .1,.1, tDivePlan - bra deco_show_plan2 + bra deco_show_plan2 deco_show_plan_bail_title: - TEXT_SMALL .1,.1, tDiveBailout + TEXT_SMALL .1,.1, tDiveBailout deco_show_plan2: - call TFT_standard_color - ; Show plan parameters + call TFT_standard_color + ;---- Display Plan Parameters WIN_SMALL .0,.25 STRCPY "Int:" movff char_I_dive_interval,lo bsf leftbind output_8 + bcf leftbind STRCAT_PRINT "'" WIN_SMALL .0,.50 STRCPY_TEXT tBtTm_short movff char_I_bottom_time,lo bsf leftbind output_8 + bcf leftbind STRCAT_PRINT "'" WIN_SMALL .0,.75 STRCPY_TEXT tDepth @@ -660,52 +485,84 @@ movff char_I_bottom_depth,lo bsf leftbind output_8 + bcf leftbind STRCAT_PRINT "m" + + WIN_SMALL .0,.105 ; set position for warnings or sat/dsat factors + + ;---- Check for Stop Table Overflow + btfss decoplan_warnings,stoptable_overflow ; check if we have a overflow warning + bra deco_show_plan2a ; NO - skip + ;---- Display Overflow warning + call TFT_warnings_color ; YES - show overflow warning + STRCAT_PRINT "incomplete" ; max 10 characters + bra deco_show_plan_m1 ; skip displaying sat/dsat factors - ; Show deco mode - WIN_TOP .155 - lfsr FSR2,buffer - movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR - call TFT_display_decotype_surface1 - - ;---- Display model - movff char_I_deco_model,WREG - iorwf WREG - bnz deco_show_plan_m1 - - ; Display ZH-L16 sat/desat model. - TEXT_SMALL .0,.130, tZHL16 - WIN_SMALL .14,.155 - PUTC "," +deco_show_plan2a: + ;---- Check for IBCD Warning + btfss decoplan_warnings,IBCD_warning_lock ; check if we have a locked IBCD warning + bra deco_show_plan2b ; NO - skip + ;---- Display IBCD warning + call TFT_attention_color ; YES - show IBCD warning + STRCAT_PRINT "IBCD!" ; max 10 characters + bra deco_show_plan_m1 ; skip displaying sat/dsat factors + +deco_show_plan2b: + ;---- Display Sat/Desat Factors --> is skipped if there were warnings + STRCAT_PRINT "SD:" + WIN_SMALL .25,.105 + movff char_I_saturation_multiplier,lo + output_8 + STRCAT "/" movff char_I_desaturation_multiplier,lo output_8 - STRCAT "%/" - movff char_I_saturation_multiplier,lo - output_8 - bra deco_show_plan_m2 + STRCAT_PRINT "" + +deco_show_plan_m1: + call TFT_standard_color ; clean-up from warnings - ; Display ZH-L16-GF low/high model. -deco_show_plan_m1: - TEXT_SMALL .0,.130, tZHL16GF - WIN_SMALL .14,.155 - PUTC "," + ;---- Get Model + movff char_I_deco_model,WREG + iorwf WREG + bz deco_show_plan_m2 + + ;---- Display GF low/high values + WIN_SMALL .0,.130 + STRCAT_PRINT "GF:" + WIN_SMALL .25,.130 movff char_I_GF_Low_percentage,lo output_99x - STRCAT "%/" + STRCAT "/" movff char_I_GF_High_percentage,lo output_99x + STRCAT_PRINT "" + deco_show_plan_m2: - STRCAT_PRINT "%" + ;---- Display Deco Mode + WIN_SMALL .0,.155 + lfsr FSR2,buffer + movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR + call TFT_display_decotype_surface1 + btfss FLAG_ccr_mode ; current dive mode = CCR ? + bra deco_show_plan2c ; NO - branch + WIN_SMALL .25,.155 + STRCPY "SP:" ; output setpoint used for calculation + movff opt_sim_setpoint_number,lo + bsf leftbind + output_8 + bcf leftbind + STRCAT_PRINT "" +deco_show_plan2c: ;---- Display TTS result WIN_SMALL .0,.180 STRCPY_TEXT tTTS STRCAT ": " - movff int_O_ascenttime+0,lo movff int_O_ascenttime+1,hi bsf leftbind output_16 + bcf leftbind STRCAT_PRINT "'" ;---- Display CNS result @@ -713,25 +570,34 @@ STRCPY_TEXT tCNS2 ; "CNS:" movff int_O_CNS_fraction+0,lo movff int_O_CNS_fraction+1,hi - output_16_3 ; limit to 999 and display only (0-999) - STRCAT "%\x92" ; "->" - movff decoplan_CNS+0,lo - movff decoplan_CNS+1,hi - output_16_3 ; limit to 999 and display only (0-999) + TFT_color_code warn_cns ; Color-code CNS output + bsf leftbind + output_16_3 ; limit to 999 and display only (0-999) + bcf leftbind + STRCAT "%\x92" ; "->" + movff int_O_normal_CNS_fraction+0,lo + movff int_O_normal_CNS_fraction+1,hi + TFT_color_code warn_cns ; Color-code CNS output + bsf leftbind + output_16_3 ; limit to 999 and display only (0-999) + bcf leftbind STRCAT_PRINT "%" + call TFT_standard_color ;---- Loop through pages deco_show_plan_1: + ; Clear the complete stop result column: + WIN_BOX_BLACK .0, .239, .80, .159 ; top, bottom, left, right + rcall deco_show_plan_page incf decoplan_page,F - call logbook_preloop_tasks deco_show_plan_2: btfsc switch_right bra deco_show_plan_3 btfsc switch_left return ; Return to simulator menu - call log_screendump_and_onesecond ; Check if we need to make a screenshot and check for new second + call log_screendump_and_onesecond ; Check if we need to make a screen shot and check for new second btfsc sleepmode ; Timeout? goto restart bra deco_show_plan_2 @@ -740,35 +606,24 @@ btfss decoplan_last_ceiling_shown bra deco_show_plan_1 ; All stops shown - -;---- In CCR mode, compute a BAILOUT decoplan --------------------------------- - banksel common - btfss FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active - bra simulator_show_decoplan5_0 ; NO: normal OC mode: just display + +;---- In CCR and pSCR mode, compute a BAILOUT deco plan ----------------------- - btfsc is_bailout ; ALREADY in bailout mode ? - bra simulator_show_decoplan5_0 ; YES: alreay BAIL plan: display gas - -; Redo 2nd deco-plann, in bailout mode: - bsf is_bailout ; Set special bailout mode. - rcall deco_planer_redo ; Redo plan computation + banksel common + movff char_O_deco_status,WREG ; get deco calculation status + btfss WREG,DECO_MODE_LOOP_FLAG ; check if in CCR or pSCR mode + bra simulator_show_decoplan5_0 ; NO - normal OC mode: just display + bsf is_bailout ; YES - redo 2nd deco-plan in bailout mode + rcall deco_planer_redo ; redo plan computation - movff char_I_setpoint_cbar+0,char_I_const_ppO2 - bra deco_show_plan ; and display bailout stops + btfss decoplan_abort ; shall we abort? + bra deco_show_plan ; NO - display bailout stops + return ; YES + ;---- In OC+BAIL modes, show the gas Usage special page ----------------------- simulator_show_decoplan5_0: - bcf is_bailout ; Back to normal - bcf ccr_diluent_setup ; init for OC/Bailout - - ; Make sure to pass first gas - call get_first_gas_to_WREG ; Gets first gas (0-4) into WREG - incf WREG,f ; gas 1..5 - movff WREG,char_I_first_gas ; Copy for compatibility - - ; Compute gas consumption for each tank. - extern deco_gas_volumes - call deco_gas_volumes + movlb .1 ; Clear the complete stop result column: @@ -785,6 +640,10 @@ simulator_show_decoplan5_loop: movff wait_temp,PRODL ; Copy to PRODL first incf wait_temp,F ; Increment gas # + + movff wait_temp,WREG + rcall simulator_color_gas ; set output color according to gas (number 1-5 in WREG) + lfsr FSR2,buffer bsf short_gas_decriptions bsf divemode ; Tweak "customview_show_mix:" @@ -797,74 +656,86 @@ movff POSTINC0,lo ; Read (16bit) result, low first, movff POSTINC0,hi ; then high. - movf lo,W ; Null ? - iorwf hi,W - movf lo,W ; == 65535 (saturated ?) + movf lo,W andwf hi,W - incf WREG - bnz simulator_show_decoplan5_2 - call TFT_attention_color - STRCAT_PRINT ":xxxx.x" - call TFT_standard_color + incf WREG ; > 65535? + bnz simulator_show_decoplan5_2 ; NO + STRCAT_PRINT ">65500" ; YES bra simulator_show_decoplan5_1 simulator_show_decoplan5_2: PUTC ":" bsf leftbind - output_16 ; No decimal anymore. + output_16 ; No decimal anymore. bcf leftbind - STRCAT_PRINT "" ; No unit: can be bars or litters. + STRCAT_PRINT "" ; No unit: can be bars or litters. ; Loop for all 5 gas simulator_show_decoplan5_1: - movlw d'5' ; list all five gases - cpfseq wait_temp ; All gases shown? + movlw d'5' ; list all five gases + cpfseq wait_temp ; All gases shown? bra simulator_show_decoplan5_loop ; No WIN_COLOR color_greenish WIN_SMALL .80,.25 - -; btfsc FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active -; bra simulator_show_decoplan5_4 ; YES: This is bailout mode - - STRCPY_TEXT tGasUsage ; OC: "Gas Usage" -; bra simulator_show_decoplan5_5 - -;simulator_show_decoplan5_4: -; STRCPY_TEXT tDiveBailout ; CCR: "Bailout" - -;simulator_show_decoplan5_5: + STRCPY_TEXT tGasUsage ; OC: "Gas Usage" STRCAT_PRINT ":" call TFT_standard_color + call logbook_preloop_tasks - call logbook_preloop_tasks simulator_show_decoplan5_3: - btfsc switch_right + btfss switch_right + bra simulator_show_decoplan5_3a + bcf switch_right + clrf decoplan_page + bra deco_show_plan_1 ; toggle between stops plan and gas usage +simulator_show_decoplan5_3a: + btfss switch_left + bra simulator_show_decoplan5_4 + bcf is_bailout ; Back to normal + bcf ccr_diluent_setup ; init for OC/Bailout return ; Return to simulator menu - btfsc switch_left - return ; Return to simulator menu - call log_screendump_and_onesecond ; Check if we need to make a screenshot and check for new second + +simulator_show_decoplan5_4: + call log_screendump_and_onesecond ; Check if we need to make a screen shot and check for new second btfsc sleepmode ; Timeout? goto restart bra simulator_show_decoplan5_3 + +simulator_color_gas: ; set output color dependent on gas (1-5, in WREG) + movwf tft_temp1 ; used in TFT_set_color anyway + dcfsnz tft_temp1,F + movlw color_white ; color for Gas 1 + dcfsnz tft_temp1,F + movlw color_green ; color for Gas 2 + dcfsnz tft_temp1,F + movlw color_red ; Color for Gas 3 + dcfsnz tft_temp1,F + movlw color_yellow ; color for Gas 4 + dcfsnz tft_temp1,F + movlw color_cyan ; color for Gas 5 + goto TFT_set_color ; set color and return... + ;============================================================================= ; global do_demo_divemode do_demo_divemode: extern option_save_all - call option_save_all ; Save all settings into EEPROM before starting simulation + call option_save_all ; Save all settings into EEPROM before starting simulation call deco_push_tissues_to_vault - banksel common ; Bank1 - - bsf restore_deco_data ; Restore tissue and CNS after sim + banksel common ; Bank1 - bcf pressure_refresh - btfss pressure_refresh ; Wait for sensor - bra $-2 + ; +++ COMMENTED OUT FOR TESTING PURPOSE ONLY !!! +++ + ; +++ DO NOT COMMENT OUT IN OPERATIONAL USE !!! +++ + bsf restore_deco_data ; Restore tissue and CNS after simulator use - bsf simulatormode_active ; Set Flag + bcf pressure_refresh + btfss pressure_refresh ; Wait for sensor + bra $-2 + + bsf simulatormode_active ; Set Flag ; Compute dive ambient conditions banksel char_I_bottom_depth movf char_I_bottom_depth,W @@ -878,9 +749,9 @@ addwfc PRODH,W movff WREG,sim_pressure+1 - banksel common ; Bank1 + banksel common ; Bank1 bsf divemode - goto diveloop ; Switch into Divemode! + goto diveloop ; Switch into Divemode! END \ No newline at end of file
--- a/src/sleepmode.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/sleepmode.asm Wed Jan 31 19:39:37 2018 +0100 @@ -168,9 +168,11 @@ return deepsleep_get_accel: - call I2C_init_compass + call I2C_init_compass ; required for compass1 + call I2C_init_accelerometer ; required for compass2 call I2C_RX_accelerometer ; read Accelerometer - call I2C_sleep_compass + call I2C_sleep_compass ; required for compass1 + call I2C_sleep_accelerometer ; required for compass2 movff accel_DZ+0,WREG return @@ -296,13 +298,11 @@ banksel common rcall sleepmode_sleep ; Wait at least 35ms (every 62,5ms Timer7 wakeup) rcall sleepmode_sleep ; Wait at least 35ms (every 62,5ms Timer7 wakeup) - bsf LEDg ; Show some activity banksel isr_backup ; Back to Bank0 ISR data call get_pressure_value ; State2: Get pressure (51us) call calculate_compensation ; calculate temperature compensated pressure (27us) banksel common SAFE_2BYTE_COPY amb_pressure_avg, amb_pressure ; copy for compatibility - bcf LEDg return sleepmode_sleep:
--- a/src/start.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/start.asm Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File start.asm +; File start.asm REFACTORED VERSION V2.95a1 ; ; Startup subroutines ; @@ -34,7 +34,7 @@ ; reset_v code 0x00000 ; goto start - goto 0x1FF00 ; Bootloader + goto 0x1FF00 ; Bootloader ORG 0x00004 ; Needed for second-level bootloader goto start @@ -53,7 +53,7 @@ call init_ostc ; Get button type from Bootloader-Info - movlw .16 + movlw .16 movff WREG,analog_counter ; init averaging bsf analog_switches movlw 0x7C @@ -62,7 +62,7 @@ movwf TBLPTRH movlw 0x01 movwf TBLPTRU - TBLRD*+ ; Reads 0x07 for analog buttons + TBLRD*+ ; Reads 0x07 for analog buttons movlw 0x07 cpfseq TABLAT bcf analog_switches @@ -72,16 +72,16 @@ movwf EEADR movlw HIGH .897 movwf EEADRH - call read_eeprom ; EEDATA into EEPROM@EEADR - clrf EEADRH ; Reset EEADRH - movff EEDATA,button_polarity ; 0xFF (Both normal), 0x00 (Both inverted), 0x01 (Left inverted only), 0x02 (Right inverted only) + call read_eeprom ; EEDATA into EEPROM@EEADR + clrf EEADRH ; Reset EEADRH + movff EEDATA,button_polarity ; 0xFF (Both normal), 0x00 (Both inverted), 0x01 (Left inverted only), 0x02 (Right inverted only) ; Air pressure compensation after reset call get_calibration_data ; Get calibration data from pressure sensor banksel common ; get_calibration_data uses isr_backup - call TFT_DisplayOff ; display off - bsf LEDr ; Status LED + call TFT_DisplayOff ; display off + bsf LEDr ; Status LED bcf pressure_refresh ; First pass will not have valid temperature! btfss pressure_refresh ; Air pressure compensation @@ -105,9 +105,9 @@ movff WREG,sub_a+1 ; max. "allowed" airpressure in mbar movff last_surfpressure+0,sub_b+0 movff last_surfpressure+1,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag ; Is 1080mbar < amb_pressure ? - bra start_copy_pressure ; NO: current airpressure is lower then "allowed" airpressure, ok! + call subU16 ; sub_c = sub_a - sub_b + btfss neg_flag ; Is 1080mbar < amb_pressure ? + bra start_copy_pressure ; NO: current airpressure is lower then "allowed" airpressure, ok! ; not ok! Overwrite with max. "allowed" airpressure movlw LOW max_surfpressure @@ -119,36 +119,44 @@ movff last_surfpressure+0,last_surfpressure_15min+0 movff last_surfpressure+1,last_surfpressure_15min+1 movff last_surfpressure+0,last_surfpressure_30min+0 - movff last_surfpressure+1,last_surfpressure_30min+1 ; Rests all airpressure registers + movff last_surfpressure+1,last_surfpressure_30min+1 ; resets all airpressure registers ; reset deco data for surface mode - movlw d'79' - movff WREG,char_I_N2_ratio ; 79% N2 - SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; copy for deco routine - movff int_I_pres_respiration+0,int_I_pres_surface+0 ; copy for desat routine + movlw .21 ; 21% + movff WREG,char_I_O2_ratio ; ... oxygen + movlw .0 ; 0% + movff WREG,char_I_He_ratio ; ... helium + + ; initialize GF high (needed by deco engine for color-coding the GF value) + movff opt_GF_high,char_I_GF_High_percentage + + SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; breathing at surface + movff int_I_pres_respiration+0,int_I_pres_surface+0 ; surface pressue movff int_I_pres_respiration+1,int_I_pres_surface+1 - extern deco_reset - call deco_reset + extern deco_setup + call deco_setup ; set up all model parameters. + call deco_clear_tissue ; Set all tissues to Pamb * N2_ratio (C-Code) + banksel common ; back to bank 1, needed after every return from C code call rtc_init ; init clock - movlw HIGH .512 ; =2 + movlw HIGH .512 ; =2 movwf EEADRH read_int_eeprom .0 clrf EEADRH movlw 0xAA - cpfseq EEDATA ; =0xAA - bra no_deco_restore ; No + cpfseq EEDATA ; =0xAA + bra no_deco_restore ; No extern restore_decodata_from_eeprom call restore_decodata_from_eeprom ; Reload deco data and date/time from eeprom no_deco_restore: - call deco_calc_desaturation_time ; calculate desaturation time + call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode + call deco_calc_desaturation_time ; calculate desaturation and no-fly time banksel common - call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode - banksel common + bcf menubit ; clear menu flag ; Check for Power-on reset here @@ -158,16 +166,16 @@ ; ***************************************************************************** ; Try to migrate the old battery status from firmware 2.09 or earlier.. - btfsc RCON,POR ; Was this a power-on reset? + btfsc RCON,POR ; Was this a power-on reset? call use_old_prior_209 ; No bcf use_old_batt_flag - btfsc RCON,POR ; Was this a power-on reset? + btfsc RCON,POR ; Was this a power-on reset? bsf use_old_batt_flag ; No call lt2942_get_status ; Check for gauge IC btfss battery_gauge_available ; cR or 2 hardware? - bra power_on_return2 ; no + bra power_on_return2 ; no movlw .30 movff WREG,opt_cR_button_right @@ -223,8 +231,8 @@ movwf lo output_99x bcf leftbind - STRCAT_PRINT "" ; Print second row - call TFT_Display_FadeIn ; Display resulting surface screen. + STRCAT_PRINT "" ; Print second row + call TFT_Display_FadeIn ; Display resulting surface screen. ; place "after-update reset" here... @@ -273,7 +281,7 @@ call option_restore_all ; Restore everything from EEPROM into RAM call option_check_all ; Check all options (and reset if not within their min/max boundaries) - call option_save_all ; Save all settings into EEPROM after they have been checked + call option_save_all ; Save all settings into EEPROM after they have been checked clrf flag1 ; clear all flags clrf flag2 @@ -287,7 +295,7 @@ clrf flag10 ; Do not clear flag11 (Sensor calibration and charger status) clrf flag12 -; ; Do not clear flag13 (Important hardware flags) + ; Do not clear flag13 (Important hardware flags) clrf flag14 clrf hardware_flag ; hardware descriptor flag bsf tft_is_dimming ; TFT is dimming up (soon), ignore ambient sensor! @@ -298,24 +306,24 @@ bsf optical_input ; Set flag call lt2942_get_status ; Check for gauge IC - btfss battery_gauge_available ; cR/2 hardware? + btfss battery_gauge_available ; cR/2 hardware? bra restart2 ; No call lt2942_init ; Yes, init battery gauge IC bcf optical_input ; Clear flag banksel 0xF16 - bcf ANCON0,7 ; AN7 Digital input + bcf ANCON0,7 ; AN7 Digital input banksel common - bcf lightsen_power ; Power-down ambient light sensor + bcf lightsen_power ; Power-down ambient light sensor bcf ambient_sensor ; Clear flag nop - btfss PORTF,2 ; Light sensor available? + btfss PORTF,2 ; Light sensor available? bsf ambient_sensor ; Yes. banksel 0xF16 - bsf ANCON0,7 ; AN7 Analog again + bsf ANCON0,7 ; AN7 Analog again banksel common - bsf lightsen_power ; Power-up ambient light sensor again + bsf lightsen_power ; Power-up ambient light sensor again restart2: btfsc vusb_in @@ -361,15 +369,15 @@ TSTOSS opt_flip_screen ; =1: Flip the screen bcf flip_screen ; Normal orientation - btfsc use_old_batt_flag ; =1: load old battery information after power-on reset - goto use_old_batteries ; Returns to "surfloop"! + btfsc use_old_batt_flag ; =1: load old battery information after power-on reset + goto use_old_batteries ; Returns to "surfloop"! - btfsc RCON,POR ; Was this a power-on reset? - goto surfloop ; Jump to Surfaceloop! - bsf RCON,POR ; Set bit for next detection + btfsc RCON,POR ; Was this a power-on reset? + goto surfloop ; Jump to Surfaceloop! + bsf RCON,POR ; Set bit for next detection ; Things to do after a power-on reset extern new_battery_menu,use_old_batteries - goto new_battery_menu ; Returns to "surfloop"! + goto new_battery_menu ; Returns to "surfloop"! ;============================================================================= ; Setup all flags and parameters for divemode and simulator computations. @@ -386,20 +394,20 @@ movlw .10 movwf samplingrate restart_set_modes_and_flags1: - bcf twosecupdate ; to have divemode routines in sync - movlw .3 - movff WREG,char_O_deco_status ; will init the deco_calc_hauptroutine on first invocation + bcf twosecupdate ; to have divemode routines in sync + bcf FLAG_apnoe_mode - bcf FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active - bcf FLAG_gauge_mode ; =1: In Gauge mode + bcf FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active + bcf FLAG_gauge_mode ; =1: In Gauge mode bcf FLAG_pscr_mode - call disable_ir_s8 ; IR off + call disable_ir_s8 ; IR off movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR tstfsz lo bra restart_set_modes_and_flags2 ; OC Mode + return restart_set_modes_and_flags2: @@ -419,15 +427,15 @@ clrf opt_ccr_mode ; Yes, reset to Fixed SP restart_set_modes_and_flags2b: banksel common - bsf FLAG_ccr_mode ; =1: CCR mode (Fixed SP, Auto SP or Sensor) active - call enable_ir_s8 ; Enable IR/S8-Port + bsf FLAG_ccr_mode ; =1: CCR mode (Fixed SP, Auto SP or Sensor) active + call enable_ir_s8 ; Enable IR/S8-Port return restart_set_modes_and_flags3: decfsz lo,F bra restart_set_modes_and_flags4 ; Gauge Mode - bsf FLAG_gauge_mode ; =1: In Gauge mode + bsf FLAG_gauge_mode ; =1: In Gauge mode return restart_set_modes_and_flags4: @@ -435,13 +443,30 @@ bra restart_set_modes_and_flags5 ; Apnea Mode bsf FLAG_apnoe_mode - return ; start in Surfacemode + return ; start in Surfacemode restart_set_modes_and_flags5: - ; PSCR Mode - bsf FLAG_pscr_mode - return ; start in Surfacemode - + ; PSCR Mode + btfsc analog_o2_input ; cR? + bra restart_set_modes_and_flags5b ; Yes, skip mode check + btfsc optical_input ; 3 + bra restart_set_modes_and_flags5b ; Yes, skip mode check + + ; Make sure Sensor is not selected + ; opt_ccr_mode must be <> 1 (=0: calculated ppO2, =1: Sensor, =2: Auto SP - not valid in pSCR, too) + banksel opt_ccr_mode + movlw .1 + cpfseq opt_ccr_mode ; = Sensor? + bra restart_set_modes_and_flags5b ; No + clrf opt_ccr_mode ; Yes, reset to calculated ppO2 + +restart_set_modes_and_flags5b: + banksel opt_ccr_mode + bcf opt_ccr_mode,1 ; in pSCR mode only calculated or Sensor, not 2 = Auto SP allowed + banksel common + bsf FLAG_pscr_mode + return ; start in Surfacemode + backup_flash_page: ; backup the first 128bytes from flash to EEPROM ; Start address in internal flash @@ -451,20 +476,20 @@ movwf TBLPTRU movlw .128 - movwf lo ; Byte counter + movwf lo ; Byte counter clrf EEADR movlw .3 - movwf EEADRH ; Setup backup address + movwf EEADRH ; Setup backup address - TBLRD*- ; Dummy read to be in 128 byte block + TBLRD*- ; Dummy read to be in 128 byte block backup_flash_loop: - tblrd+* ; Table Read with Pre-Increment - movff TABLAT,EEDATA ; put 1 byte - call write_eeprom ; save it in EEPROM + tblrd+* ; Table Read with Pre-Increment + movff TABLAT,EEDATA ; put 1 byte + call write_eeprom ; save it in EEPROM incf EEADR,F - decfsz lo,F ; 128byte done? - bra backup_flash_loop ; No - clrf EEADRH ; Reset EEADRH - return ; Done. + decfsz lo,F ; 128byte done? + bra backup_flash_loop ; No + clrf EEADRH ; Reset EEADRH + return ; Done. END \ No newline at end of file
--- a/src/start.inc Wed Dec 27 14:34:11 2017 +0100 +++ b/src/start.inc Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File start.inc +; File start.inc V2.95 ; ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
--- a/src/strings.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/strings.asm Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File strings.asm +; File strings.asm Version 2.92 = 2.26 ; ; Implementation code various string functions. ; @@ -101,7 +101,7 @@ global text_get_tblptr text_get_tblptr: extern text_1_base - movlw UPPER(text_1_base); Complete 12bits to 24bits address. + movlw UPPER(text_1_base) ; Complete 12bits to 24bits address. movwf TBLPTRU movlw HIGH(text_1_base) andlw 0xF0 @@ -109,10 +109,11 @@ movwf TBLPTRH movff FSR1L,TBLPTRL - movff opt_language,WREG ; Get lang - bz text_get_lang1 ; 0 == English - dcfsnz WREG ; 1 == German - bra text_get_lang2 + + movff opt_language,WREG ; Get lang + bz text_get_lang1 ; 0 == English + dcfsnz WREG ; 1 == German + bra text_get_lang2 ; Other ??? Keep language 1 ; Read 2-byte pointer to string @@ -126,21 +127,21 @@ ; Add correction for German table: text_get_lang2: - extern text_2_base - movlw LOW(text_2_base) - addwf TBLPTRL - movlw HIGH(text_2_base) - addwfc TBLPTRH - movlw UPPER(text_2_base) - addwfc TBLPTRU + extern text_2_base + movlw LOW(text_2_base) + addwf TBLPTRL + movlw HIGH(text_2_base) + addwfc TBLPTRH + movlw UPPER(text_2_base) + addwfc TBLPTRU - movlw LOW(text_1_base) - subwf TBLPTRL - movlw HIGH(text_1_base) - subwfb TBLPTRH - movlw UPPER(text_1_base) - subwfb TBLPTRU - bra text_get_lang1 + movlw LOW(text_1_base) + subwf TBLPTRL + movlw HIGH(text_1_base) + subwfb TBLPTRH + movlw UPPER(text_1_base) + subwfb TBLPTRU + bra text_get_lang1 ;============================================================================= ; Copy a null-terminated string from TBLPTR to buffer. @@ -183,33 +184,29 @@ global start_tiny_block start_tiny_block: clrf WREG - movff WREG, win_font ; Need a bank-safe move here ! bra start_common global start_small_block start_small_block: movlw 1 - movff WREG, win_font ; Need a bank-safe move here ! bra start_common global start_std_block start_std_block: movlw 2 - movff WREG, win_font ; Need a bank-safe move here ! bra start_common global start_medium_block start_medium_block: movlw 3 - movff WREG, win_font ; Need a bank-safe move here ! bra start_common global start_large_block start_large_block: movlw 4 - movff WREG, win_font ; Need a bank-safe move here ! ; bra start_common start_common: + movff WREG, win_font ; Need a bank-safe move here ! VARARGS_BEGIN VARARGS_GET8 win_leftx2 VARARGS_GET8 win_top
--- a/src/surfmode.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/surfmode.asm Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File surfmode.asm +; File surfmode.asm REFACTORED VERSION V2.94 ; ; Surfacemode ; @@ -9,7 +9,7 @@ ; HISTORY ; 2011-08-07 : [mH] moving from OSTC code -#include "hwos.inc" ; Mandatory header +#include "hwos.inc" ; Mandatory header #include "shared_definitions.h" ; Mailbox from/to p2_deco.c #include "start.inc" #include "tft.inc" @@ -43,16 +43,15 @@ ; Boot tasks for all modes global surfloop surfloop: - call speed_normal + call speed_normal bcf no_sensor_int ; Normal pressure mode - bcf LEDg bcf LEDr - clrf CCP1CON ; stop PWM - bcf PORTC,2 ; Pull PWM output to GND - call TFT_boot ; Initialize TFT (includes clear screen) - bcf restore_deco_data + clrf CCP1CON ; stop PWM + bcf PORTC,2 ; Pull PWM output to GND + call TFT_boot ; Initialize TFT (includes clear screen) + bcf restore_deco_data WIN_TOP .50 WIN_LEFT .10 @@ -100,8 +99,10 @@ bcf ccr_diluent_setup ; Use OC gases for gaslist routine bcf simulatormode_active ; Quit simulator mode (if active) - bcf switch_left - bcf switch_right + + ; MOVE from here to below ## V2.94 + ; bcf switch_left + ; bcf switch_right ;---- Fade to standard surface view -------------------------------------- ; Wait 1 second @@ -145,8 +146,12 @@ call TFT_update_surf_press ; display surface pressure call TFT_temp_surfmode ; Displays temperature call TFT_display_decotype_surface - call compute_ppo2 ; compute mv_sensorX and ppo2_sensorX arrays - call check_sensors ; Set enable/disable flags + +; REPLACE ## voting logic +; call compute_ppo2 ; compute mv_sensorX and ppo2_sensorX arrays +; call check_sensors ; Set enable/disable flags +; BY + call calc_deko_divemode_sensor movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR tstfsz lo @@ -158,20 +163,32 @@ call TFT_Display_FadeIn ; Display resulting surface screen. + ; MOVED from above to here ## V2.94 + bcf switch_left + bcf switch_right + ;---- Late initialisations ----------------------------------------------- - movff last_surfpressure_30min+0,int_I_pres_respiration+0 ; copy surface air pressure to deco routine - movff last_surfpressure_30min+1,int_I_pres_respiration+1 ; 30min old values + movff last_surfpressure_30min+0,int_I_pres_respiration+0 ; copy surface air pressure to deco routine ## not used any more (!?) + movff last_surfpressure_30min+1,int_I_pres_respiration+1 ; 30min old values ## not used any more (!?) movff last_surfpressure_30min+0,int_I_pres_surface+0 ; copy surface air pressure to deco routine movff last_surfpressure_30min+1,int_I_pres_surface+1 ; 30min old values movff last_surfpressure_30min+0,last_surfpressure+0 ; Use 30min old airpressure movff last_surfpressure_30min+1,last_surfpressure+1 ; Use 30min old airpressure + ; NEW ## no fly + movff opt_GF_low,char_I_GF_Low_percentage + movff opt_GF_high,char_I_GF_High_percentage + ; Startup tasks for all modes ; Desaturation time needs: ; int_I_pres_surface ; char_I_desaturation_multiplier call deco_calc_desaturation_time ; calculate desaturation time - movlb b'00000001' ; select ram bank 1 + + ; REPLACE ## (code unification) + ; movlb b'00000001' ; select ram bank 1 + ; BY + banksel common btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) call enable_rs232 ; Also sets to speed_normal ... @@ -192,7 +209,6 @@ call TFT_temp_surfmode ; Displays temperature btfss secs,0 ; Every two seconds... call surfmode_check_for_warnings ; ... check for warnings (and display/update) them - bcf onesecupdate ; every second tasks done surfloop_loop2: @@ -222,23 +238,27 @@ bcf quarter_second_update ; Update Sensors - call compute_ppo2 ; compute mv_sensorX and ppo2_sensorX arrays - call check_sensors ; Set enable/disable flags + ; REPLACE ## voting logic + ; call compute_ppo2 ; compute mv_sensorX and ppo2_sensorX arrays + ; call check_sensors ; Set enable/disable flags + ; BY + call calc_deko_divemode_sensor + btfsc FLAG_ccr_mode ; In CCR mode? - bra surfloop_loop2a1 ; Yes. + bra surfloop_loop2a1 ; Yes. btfss FLAG_pscr_mode ; In PSCR mode? - bra surfloop_loop2a ; No, skip + bra surfloop_loop2a ; No, skip surfloop_loop2a1: movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP sublw .1 ; opt_ccr_mode = 1 (Sensor)? - bnz surfloop_loop2a ; No, skip + bnz surfloop_loop2a ; No, skip call TFT_surface_sensor ; ...update sensor data in surface mode call TFT_sensor_surface_warning ; Show a warning arrow-down behind sensor readings when sensor is end-of-life movlw .9 - cpfseq menupos3 ; in Sensor mV surface custom view? - bra surfloop_loop2a ; No + cpfseq menupos3 ; in Sensor mV surface custom view? + bra surfloop_loop2a ; No extern TFT_sensor_mV call TFT_sensor_mV ; Yes, update mV readings (Each 1/4 second and not each second as in customview.asm) @@ -255,8 +275,12 @@ btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) bra surfloop_loop3 - btfsc vusb_in ; USB plugged in? - call comm_mode ; Start COMM mode + + ; DELETE - In surface mode, only charing is available now - but now you can see the charging status :-) ## USB + ; To do USB communication, you now need to be in menu or logbook mode + ;btfsc vusb_in ; USB plugged in? + ;call comm_mode ; Start COMM mode + bra surfloop_loop4 surfloop_loop3: btfss vusb_in ; USB (still) plugged in? @@ -267,45 +291,87 @@ movlw "l" cpfseq RCREG1 bra surfloop_loop4 - call TFT_dump_screen ; Dump the screen contents + call TFT_dump_screen ; Dump the screen contents surfloop_loop4: - btfsc sleepmode ; Sleepmode active? - goto sleeploop ; Yes, switch into sleepmode! + btfsc sleepmode ; Sleepmode active? + goto sleeploop ; Yes, switch into sleepmode! - bra surfloop_loop ; loop surfacemode + bra surfloop_loop ; loop surfacemode update_surfloop60: ; One minute tasks for all modes - call TFT_date ; Update date - call calc_deko_surfmode ; calculate desaturation every minute + call TFT_date ; Update date + + ; REPLACE ## no fly 2 + ; call calc_deko_surfmode ; calculate desaturation time every minute + ; BY + call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode. int_I_pres_surface gets updated by + call deco_calc_desaturation_time ; TFT_update_surf_press when amb_pressure has changed by >= 10 mbar + banksel common + + ; NEW ## deco engine + ; update tissue diagram if it is on display + movlw .5 ; number of tissue custom view + cpfseq menupos3 ; is this the current customview? + bra update_surfloop60_1 ; NO + call TFT_standard_color ; YES - set standard color + call TFT_surface_tissues ; show tissue diagram +update_surfloop60_1: + + ; NEW ## no fly + ; update last dive info if it is on display + movlw .8 ; number of the last dive info customview + cpfseq menupos3 ; is this the current customview? + bra update_surfloop60_2 ; NO + call TFT_standard_color ; YES - set standard color + call TFT_surface_lastdive ; show last dive infos +update_surfloop60_2: + bcf oneminupdate return extern check_cns_violation,check_warn_battery,check_and_store_gf_violation surfmode_check_for_warnings: - movf warning_counter_backup,W - cpfseq warning_counter ; warning_counter_backup = warning_counter? - call TFT_clear_warning_text ; No, clear all warnings - movff warning_counter,warning_counter_backup ; copy warning_counter + + ; DELETE ## (screen flicker) + ; movf warning_counter_backup,W + ; cpfseq warning_counter ; warning_counter_backup = warning_counter? + ; call TFT_clear_warning_text ; No, clear all warnings + ; movff warning_counter,warning_counter_backup ; copy warning_counter bcf warning_active ; Clear flag clrf warning_counter ; Clear counter ; Warnings for all modes call check_warn_battery ; Check if the battery level should be displayed/warned - rcall surfmode_check_for_nofly ; Check if nofly time should be shown - rcall surfmode_check_for_desat ; Check if desat time should be shown - rcall surfmode_check_for_interval ; Check if surface interval should be shown + + ; DELETE HERE... ## (general fix) + ; rcall surfmode_check_for_nofly ; Check if nofly time should be shown + ; rcall surfmode_check_for_desat ; Check if desat time should be shown + + ; DELETE - surface interval is now shown in last dive custom view, not as "warning" any more ## no fly + ; rcall surfmode_check_for_interval ; Check if surface interval should be shown - btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode + btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode bra surfmode_check_for_warnings2 - btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode + btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode bra surfmode_check_for_warnings2 ; Warnings only in deco modes + + ; ...INSERT HERE ## (general fix) - desat and no-fly time belong to deco modes + rcall surfmode_check_for_desat ; Check if desat time should be shown + rcall surfmode_check_for_nofly ; Check if nofly time should be shown + call check_cns_violation ; Check CNS value and display it, if required call check_and_store_gf_violation ; Check GF value and display it, if required + ; NEW ## microbubbles + movff char_O_deco_warnings,WREG ; bank-safe copy for deco warnings + btfsc WREG,mbubble_warning_lock ; do we have a microbubbles warning? + extern warn_mbubbles + call warn_mbubbles ; YES + surfmode_check_for_warnings2: ; Setup warning_page number incf warning_page,F @@ -313,51 +379,98 @@ rlcf warning_page,W ; *2 cpfsgt warning_counter ; > warning_counter clrf warning_page ; No, clear + + ; NEW ## (screen flicker) +; Clear both rows of warnings if there is nothing to show at all + tstfsz warning_counter ; any warnings? + bra surfmode_check_for_warnings3 ; YES - look if second row needs to be cleared + call TFT_clear_warning_text ; NO - clear complete warnings area + return +surfmode_check_for_warnings3: ; Clear 2nd row of warnings if there is nothing to show (on this page) btfss second_row_warning ; =1: The second row contains a warning call TFT_clear_warning_text_2nd_row ; No, clear this row return ; Done. -surfmode_check_for_interval: - movf surface_interval+0,W ; Is interval null ? - iorwf surface_interval+1,W - bnz surfmode_check_for_interval2 ; No - return -surfmode_check_for_interval2: - incf warning_counter,F ; increase counter - call TFT_interval - return +; DELETE - surface interval is now shown in last dive custom view, not as "warning" any more ## no fly +; +;surfmode_check_for_interval: +; movf surface_interval+0,W ; Is interval null ? +; iorwf surface_interval+1,W +; bnz surfmode_check_for_interval2 ; No +; return +;surfmode_check_for_interval2: +; incf warning_counter,F ; increase counter +; call TFT_interval +; return surfmode_check_for_desat: - movf desaturation_time+0,W ; Is nofly null ? - iorwf desaturation_time+1,W - bnz surfmode_check_for_desat2 ; No + ; REPLACE ## no fly + ; movf desaturation_time+0,W ; Is nofly null ? + ; iorwf desaturation_time+1,W + ; BY + banksel int_O_desaturation_time + movf int_O_desaturation_time+0,W ; Is nofly null ? + iorwf int_O_desaturation_time+1,W + + bnz surfmode_check_for_desat2 ; No + + ; NEW ## no fly + banksel common + return + surfmode_check_for_desat2: - incf warning_counter,F ; increase counter + ; NEW ## no fly + banksel common + + incf warning_counter,F ; increase counter call TFT_desaturation_time return surfmode_check_for_nofly: - movf nofly_time+0,W ; Is nofly null ? - iorwf nofly_time+1,W - bnz surfmode_check_for_nofly2 ; No... + ; REPLACE ## no fly + ; movf nofly_time+0,W ; Is nofly null ? + ; iorwf nofly_time+1,W + ; BY + banksel int_O_nofly_time + movf int_O_nofly_time+0,W ; Is nofly null ? + iorwf int_O_nofly_time+1,W + + bnz surfmode_check_for_nofly2 ; No... + + ; NEW ## no fly + banksel common + return + surfmode_check_for_nofly2: - incf warning_counter,F ; increase counter + ; NEW ## no fly + banksel common + + incf warning_counter,F ; increase counter call TFT_nofly_time return ;============================================================================= - global calc_deko_surfmode -calc_deko_surfmode: - SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; copy surface air pressure to deco routine - call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode - banksel common - return + +; DELETE - not used any more ## no fly +; global calc_deko_surfmode +;calc_deko_surfmode: +; +; ; DELETE - deco_calc_wo_deco_step_1_min uses int_I_pres_surface, not int_I_pres_respiration ## no fly +; ; SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; copy surface air pressure to deco routine +; +; call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode +; +; ; NEW ## no fly +; ; call deco_calc_desaturation_time +; +; banksel common +; return test_switches_surfmode: ; checks switches in surfacemode btfsc switch_right @@ -383,7 +496,7 @@ test_switches_surfmode3a: bcf switch_left - bsf menubit ; Enter Menu! + bsf menubit ; Enter Menu! return test_switches_surfmode3b:
--- a/src/surfmode.inc Wed Dec 27 14:34:11 2017 +0100 +++ b/src/surfmode.inc Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File surfmode.inc +; File surfmode.inc REFACTORED VERSION V2.92 ; ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. @@ -9,7 +9,7 @@ ; 2011-08-07 : [mH] moving from OSTC code extern surfloop - extern calc_deko_surfmode +; extern calc_deko_surfmode DELETED - not used any more ## no fly extern timeout_surfmode extern timeout_testmode @@ -39,7 +39,7 @@ #DEFINE surf_warning_length .11 ; total string length #DEFINE surf_temp_row .185 -#DEFINE surf_temp_column .120 +#DEFINE surf_temp_column .120 ; CHANGED - clear overlapp with warning text area ## temp #DEFINE surf_press_row .160 #DEFINE surf_press_column .98
--- a/src/text_english.inc Wed Dec 27 14:34:11 2017 +0100 +++ b/src/text_english.inc Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File text_english.asm +; File text_english.asm REFACTORED VERSION V2.95 ; ; English texts reference file. ; @@ -8,291 +8,334 @@ ;============================================================================= ; Basic texts - TCODE tNo, "No" ; No - TCODE tYes, "Yes" ; Yes = No + 1 - + TCODE tNo, "No" ; No + TCODE tYes, "Yes" ; Yes = No + 1 + TCODE tblank, " " ; (a single space character) ## NEW (layout) + ; Surface-mode texts - TCODE tBeta, "beta" ; beta - TCODE tMenu, "<Menu" ; <Menu - TCODE tView, "View>" ; View> - TCODE tHeading, "Heading:" ; Heading: - TCODE tLastDive, "Last Dive" ; Last Dive (Max 10 chars) - TCODE tSensorMilliVolt, "CCR Sensors mV" ; CCR Sensors mV + TCODE tBeta, "beta" ; beta + TCODE tMenu, "<Menu" ; <Menu + TCODE tView, "View>" ; View> + TCODE tHeading, "Heading:" ; Heading: + TCODE tLastDive, "Last Dive" ; Last Dive (Max 10 chars) + TCODE tSensorMilliVolt, "CCR Sensors mV" ; CCR Sensors mV ; Divemode Menu TCODE tDivemenu_Gaslist, "Gaslist" ; Gaslist TCODE tDivemenu_ResetAvg, "Reset Avg." ; Reset Avg. TCODE tDivemenu_Setpoint, "Setpoint" ; Setpoint - TCODE tDivemenu_UseSensor,"Use Sensor" ; Use Sensor + TCODE tDivemenu_UseSensor,"use Sensor" ; Use Sensor TCODE tDivemenu_ToggleGF, "Toggle GF" ; Toggle GF TCODE tDivemenu_Marker, "Set Marker" ; Set Marker TCODE tDivemenu_LostGas, "Lost Gas" ; Lost Gas ; Main menu - TCODE tNext, "<Next" ; <Next - TCODE tEnter, "Enter>" ; Enter> + TCODE tNext, "<Next" ; <Next + TCODE tEnter, "Enter>" ; Enter> - TCODE tMainMenu, "Main Menu" ; MainMenu - TCODE tLogbook, "Logbook" ; Logbook - TCODE tGasSetup, "OC Gas Setup" ; OC Gas Setup - TCODE tSetTime, "Set Time" ; Set Time - TCODE tSetDate, "Set Date" ; Set Date - TCODE tSetTimeDate,"Set Time & Date"; Set Time & Date - TCODE tDispSets, "Display Settings" ; Display Settings - TCODE tExit, "Exit" ; Exit - TCODE tResetMenu, "Reset Menu" ; Reset Menu - TCODE tDiveModeMenu,"Deco Mode" ; Deco Mode - TCODE tInfoMenu, "Information" ; Information - TCODE tCCRSetup, "CCR Setup" ; CCR Setup - TCODE tDiluentSetup,"Diluent Setup" ; Diluent Setup - TCODE tFixedSetpoints,"Fixed Setpoints" ; Fixed Setpoints - TCODE tCCRSensor, "CCR Sensor" ; CCR Sensor - TCODE tCalibrateMenu, "Calibration" ; Calibration - TCODE tCalibrationGas, "Cal. Gas O2:" ; Cal. Gas O2: - TCODE tCalibrate, "Calibrate" ; Calibrate + TCODE tMainMenu, "Main Menu" ; MainMenu + TCODE tLogbook, "Logbook" ; Logbook + TCODE tGasSetup, "OC Gas Setup" ; OC Gas Setup + TCODE tSetTime, "Set Time" ; Set Time + TCODE tSetDate, "Set Date" ; Set Date + TCODE tSetTimeDate, "Set Time & Date" ; Set Time & Date + TCODE tDispSets, "Display Settings" ; Display Settings + TCODE tExit, "Exit" ; Exit + TCODE tResetMenu, "Reset Menu" ; Reset Menu + TCODE tDiveModeMenu, "Deco Setup" ; Deco Setup ## MODIFIED (consistent naming) + TCODE tInfoMenu, "Information" ; Information + TCODE tCCRSetup, "CCR/pSCR Setup" ; CCR/pSCR Setup ## MODIFIED (consistent naming) + TCODE tDiluentSetup, "Diluent Setup" ; Diluent Setup + TCODE tFixedSetpoints,"CCR Setpoints" ; Fixed Setpoints for CCR ## MODIFIED (consistent naming) + TCODE tCCRSensor, "Sensor" ; CCR/pSCR Sensor ## MODIFIED (consistent naming) + TCODE tCalibrateMenu, "Calibration" ; Calibration + TCODE tCalibrationGas,"Cal. Gas O2:" ; Cal. Gas O2: + TCODE tCalibrate, "Calibrate" ; Calibrate + TCODE tBack, "back..." ; ## NEW ; Gas menu - TCODE tGaslist, "OC Gas List" - TCODE tGaslistCC, "CC Diluents" - TCODE tGasEdit, "Edit Gas" - TCODE tType, "Type: " - TCODE tGasDisabled,"Disabled" ; Disabled - TCODE tGasFirst, "First" ; First - TCODE tGasTravel, "Travel" ; Travel - TCODE tGasDeco, "Deco" ; Deco - TCODE tDilDisabled,"Disabled" ; Disabled - TCODE tDilFirst, "First" ; First - TCODE tDilNorm, "Normal" ; Normal - TCODE tAir, "Air " ; Enum: values must follows (5 chars) - TCODE tO2, "O2 " ; tAir + 5 - TCODE tO2Plus, "O2 +" - TCODE tO2Minus, "O2 -" - TCODE tHePlus, "He +" - TCODE tHeMinus, "He -" - TCODE tMOD, "MOD:" - TCODE tEAD, "EAD:" - TCODE tGasDepth, "Change depth" - TCODE tDepthPlus, "Depth +" - TCODE tDepthMinus,"Depth -" - TCODE tDepthReset,"Reset to MOD:" - TCODE tSetup_mix, "Setup Mix" - TCODE tCCRMode, "CCR Mode:" ; CCR Mode: - TCODE tCCRModeFixedSP, "Fixed SP" ; Fixed SP - TCODE tCCRModeSensor, "Sensor" ; Sensor - TCODE tCCRModeAutoSP, "Auto SP" ; Auto SP + TCODE tGaslist, "OC Gas List" + TCODE tGaslistCC, "CC Diluents" + TCODE tGasEdit, "Edit Gas" + TCODE tType, "Type: " + TCODE tGasDisabled, "Disabled" ; Disabled + TCODE tGasFirst, "First" ; First + TCODE tGasTravel, "Travel" ; Travel + TCODE tGasDeco, "Deco" ; Deco + TCODE tDilDisabled, "Disabled" ; Disabled + TCODE tDilFirst, "First" ; First + TCODE tDilNorm, "Normal" ; Normal + TCODE tAir, "Air " ; Enum: values must follow (5 chars) + TCODE tO2, "O2 " ; tAir + 5 + TCODE tO2Plus, "O2 +" + TCODE tO2Minus, "O2 -" + TCODE tHePlus, "He +" + TCODE tHeMinus, "He -" + TCODE tMOD, "MOD:" + TCODE tEAD, "EAD:" + TCODE tGasDepth, "Change depth" + TCODE tDepthPlus, "Depth +" + TCODE tDepthMinus, "Depth -" + TCODE tDepthReset, "Reset to MOD:" + TCODE tSetup_mix, "Setup Mix" + TCODE tCCRMode, "Mode:" ; Mode: ## MODIFIED (layout) + TCODE tCCRModeFixedSP,"Fixed SP/Calc." ; Fixed for CCR / Calc.for pSCR ## MODIFIED (layout) + TCODE tCCRModeSensor, "Sensor" ; Sensor + TCODE tCCRModeAutoSP, "Auto SP" ; Auto SP TCODE tSP, "SP" ; SP (SetPoint) - TCODE tSPPlus, "ppO2+" ; pO2+ - TCODE tSensorFallback, "Fallback:" ; Fallback: - TCODE tppO2, "ppO2:" ; ppO2: - TCODE tppO2O2, "ppO2(O2)" ; ppO2(O2) - TCODE tppO2Dil, "ppO2(Dil)" ; ppO2(Dil) - - TCODE tNewBattTitle, "New Battery?" - TCODE tNewBattOld, "Keep old" - TCODE tNewBattNew36, "New 3.6V Saft" - TCODE tNewBattNew15, "New 1.5V AA" - TCODE tNewBattAccu, "3.6V LiIon AA" + TCODE tSPPlus, "ppO2+" ; pO2+ + TCODE tSensorFallback,"Fallback:" ; Fallback: + TCODE tCalculated, "calculated" ; calculated + TCODE tppO2, "ppO2:" ; ppO2: + TCODE tppO2O2, "ppO2(O2)" ; ppO2(O2) + TCODE tppO2Dil, "ppO2(Dil)" ; ppO2(Dil) + TCODE tppO2Mix, "ppO2(Mix)" ; ppO2(Mix) + +; New batteries menu + TCODE tNewBattTitle, "New Battery?" + TCODE tNewBattOld, "Keep old" + TCODE tNewBattNew36, "New 3.6V Saft" + TCODE tNewBattNew15, "New 1.5V AA" + TCODE tNewBattAccu, "3.6V LiIon AA" TCODE tNew18650, "Internal 18650" TCODE tNew16650, "Internal 16650" - ; Gaslist management - TCODE tGas, "Gas" ; Gas - TCODE tGasErr, "Err" ; Err (3 chars) + TCODE tGas, "Gas" ; Gas + TCODE tGasErr, "Err" ; Err (3 chars) ; Communication Menu - TCODE tUsbTitle, "USB Mode" - TCODE tBleTitle, "Bluetooth Mode" - TCODE tUsbStarting, "Starting..." - TCODE tUsbStartDone, "Done." - TCODE tUsbServiceMode, "Service mode enabled" + TCODE tUsbTitle, "USB Mode" + TCODE tBleTitle, "Bluetooth Mode" + TCODE tUsbStarting, "Starting..." + TCODE tUsbStartDone, "Done." + TCODE tUsbServiceMode,"Service mode enabled" TCODE tUsbClosed, "Port closed" TCODE tUsbExit, "Exited" - TCODE tUsbDownloadMode, "Download mode enabled" + TCODE tUsbDownloadMode,"Download mode enabled" TCODE tUsbLlBld, "Low-level Bootloader" ; Dive Settings - TCODE tDvMode, "Dive Mode:" - TCODE tDvOC, "OC" - TCODE tDvCC, "CC" - TCODE tDvGauge, "Gauge" - TCODE tDvApnea, "Apnea" - TCODE tDvPSCR, "PSCR" - TCODE tDkMode, "Decotype:" - TCODE tZHL16, "ZH-L16" - TCODE tZHL16GF, "ZH-L16+GF" - TCODE tPPO2Max, "ppO2 Max:" - TCODE tPPO2DECO, "ppO2 Deco:" - TCODE tPPO2MIN, "ppO2 Min:" - TCODE tLastDecostop, "Last Deco:" - TCODE tDecoparameters, "Deco Parameters" - TCODE tGF_low, "GF low:" - TCODE tGF_high, "GF high:" - TCODE tSaturationMult, "Saturation:" - TCODE tDesaturationMult, "Desaturation:" - TCODE tFTTSMenu, "Future TTS:" ; Future TTS - TCODE taGFMenu, "Alternative GF" ; Alternative GF - TCODE taGF_low, "aGF low:" ; aGF low - TCODE taGF_high, "aGF high:" ; aGF high - TCODE taGF_enable,"aGF selectable:" ; aGF Selectable - TCODE tDiveaGF_active,"aGF!" ; aGF! - TCODE tppO2settings,"ppO2 Settings" ; ppO2 Settings - TCODE tsafetystopmenu,"Safety Stop:" ; Safety Stop: + TCODE tDvMode, "Dive Mode:" + TCODE tDvOC, "OC" ; keep order, enum from here... + TCODE tDvCCR, "CCR" + TCODE tDvGauge, "Gauge" + TCODE tDvApnea, "Apnea" + TCODE tDvPSCR, "pSCR" ; ...up to here! + TCODE tDvCC, "CC" + TCODE tDkMode, "Decotype:ZH-L16" ; ## MODIFIED (memory needs) + TCODE tZHL16, " " ; keep order, enum from here... ## MODIFIED (memory needs) + TCODE tZHL16GF, "+GF" ; ...up to here! ## MODIFIED (memory needs) + TCODE tPPO2Max, "Max :" ; ## MODIFIED (layout) + TCODE tPPO2DECO, "Max Deco:" ; ## MODIFIED (layout) + TCODE tPPO2MIN, "Min :" ; ## MODIFIED (layout) + TCODE tPPO2MINCC, "Min Loop:" ; ## NEW ppO2 min cc + TCODE tLastDecostop, "Last Deco:" + TCODE tDecoparameters,"Deco Parameters" + TCODE tGF_low, "GF low :" ; ## MODIFIED (layout) + TCODE tGF_high, "GF high:" + TCODE tSaturationMult, "Saturation :" ; ## MODIFIED (layout) + TCODE tDesaturationMult,"Desaturation:" + TCODE tFTTSMenu, "fTTS/Delay:" ; Future TTS / Ascent Delay ## MODIFIED (layout) + TCODE taGFMenu, "Alternative GF" ; Alternative GF + TCODE taGF_low, "aGF low :" ; aGF low ## MODIFIED (layout) + TCODE taGF_high, "aGF high:" ; aGF high + TCODE taGF_enable, "aGF selectable:" ; aGF Selectable + TCODE tDiveaGF_active,"aGF!" ; aGF! + TCODE tppO2settings, "ppO2 Settings" ; ppO2 Settings + TCODE tsafetystopmenu,"Safety Stop:" ; Safety Stop: + TCODE tGasUsage, "Gas Usage" ; Gas Usage + TCODE tSetBotUse, "Bottom Gas: " ; Bottom Gas: (space) + TCODE tSetDecoUse, "Deco Gas: " ; Deco Gas: (space) ## MODIFIED (layout) + TCODE tCalcAscGas, "Calc.Gas (B/O):" ; ## NEW bailout gas needs + TCODE tTankSizes, "Tank Sizes" ; ## NEW bailout gas needs + TCODE tLiter, " l" ; ## NEW bailout gas needs + TCODE tTankFillPress, "Tank Press Budget"; + TCODE tGas1, "Gas 1:" ; ## NEW bailout gas needs + TCODE tGas2, "Gas 2:" ; ## NEW bailout gas needs + TCODE tGas3, "Gas 3:" ; ## NEW bailout gas needs + TCODE tGas4, "Gas 4:" ; ## NEW bailout gas needs + TCODE tGas5, "Gas 5:" ; ## NEW bailout gas needs + TCODE tCCmaxFracO2, "Loop %O2 max.:" ; ## NEW CCR max ppO2 limiter + TCODE t2ndDecoPlanMenu,"2nd Deco Plan" ; ## NEW deco engine ; Display Settings - TCODE tBright, "Brightness:" - TCODE tEco, "Eco" - TCODE tMedium, "Medium" - TCODE tHigh, "High" - TCODE tDvSalinity,"Salinity:" ; Salinity - TCODE tFlip, "Rotate Screen:" ; Rotate Screen - TCODE tMODwarning,"MOD warning:" ; MOD warning - TCODE tShowppO2, "Always show ppO2:" ; Always show ppO2: - TCODE tTimeoutDive,"Dive Timeout:" ; Dive Timeout - + TCODE tBright, "Brightness:" + TCODE tEco, "Eco" + TCODE tMedium, "Medium" + TCODE tHigh, "High" + TCODE tDvSalinity, "Salinity: " ; Salinity ## MODIFIED (layout) + TCODE tShowppO2, "Always show ppO2:" ; Always show ppO2: + TCODE tFlip, "Rotate Screen:" ; Rotate Screen + TCODE tMODwarning, "MOD Warning :" ; MOD warning ## MODIFIED (layout) + TCODE tIBCDwarning, "IBCD Warning :" ; IBCD Warning ## NEW IBCD + TCODE tTimeoutDive, "Dive Timeout:" ; Dive Timeout ## MODIFIED (layout) + ; VSI display Settings - TCODE tVSItext2, "Variable speed:" ; Variable speed: - TCODE tVSIgraph, "Speed graph:" ; Speed graph: + TCODE tVSItext2, "Variable Speed:" ; Variable speed: ## MODIFIED (layout) + TCODE tVSIgraph, "Speed Graph:" ; Speed graph: ## MODIFIED (layout) ; Setup Menu - TCODE tSystSets, "Settings" - TCODE tLanguage, "Language:" - TCODE tEnglish, "English" - TCODE tGerman, "German" - TCODE tFrench, "French" - TCODE tItalian, "Italian" - TCODE tCompassMenu,"Compass calibration" ; Compass calibration - TCODE tCompassGain,"Compass Gain:" ; Compass gain: - TCODE tCalX, "Cal X:" ; Cal X - TCODE tCalY, "Cal Y:" ; Cal Y - TCODE tCalZ, "Cal Z:" ; Cal Z + TCODE tSystSets, "Settings" + TCODE tLanguage, "Language:" + TCODE tEnglish, "English" + TCODE tGerman, "German" + TCODE tFrench, "French" + TCODE tItalian, "Italian" + TCODE tCompassMenu, "Compass calibration" + TCODE tCompassGain, "Compass Gain:" + TCODE tCalX, "Cal X:" ; Cal X + TCODE tCalY, "Cal Y:" ; Cal Y + TCODE tCalZ, "Cal Z:" ; Cal Z - TCODE tUnits, "Units:" - TCODE tMetric, " m/°C" ; Enum menu - TCODE tImperial, "ft/°F" - - TCODE tDefName, "HW OSTC" - TCODE tbar, "bar" ; bar + TCODE tUnits, "Units:" + TCODE tMetric, " m/°C" ; Enum menu + TCODE tImperial, "ft/°F" + + TCODE tDefName, "HW OSTC" - TCODE tButtonleft,"Left button:" ; Left button - TCODE tButtonright,"Right button:" ; Right button + TCODE tButtonleft, "Left button:" ; Left button + TCODE tButtonright, "Right button:" ; Right button + + TCODE tAltMode, "Waiting Time:" ; ## NEW no fly altitude + TCODE tAltModeFly, "Flying" ; ## NEW no fly altitude + TCODE tAltMode1000, "1000m" ; ## NEW no fly altitude + TCODE tAltMode2000, "2000m" ; ## NEW no fly altitude + TCODE tAltMode3000, "3000m" ; ## NEW no fly altitude ; Units for all menu - TCODE tMeters, "m" - TCODE tFeets, "ft" - TCODE tFeets1, "f" - TCODE tMinutes, "'" - TCODE tPercent, "%" - TCODE tLitersMinute, "l/min" + TCODE tMeters, "m" + TCODE tFeets, "ft" + TCODE tFeets1, "f" + TCODE tMinutes, "'" + TCODE tPercent, "%" + TCODE tLitersMinute, "l/min" + TCODE tbar, " bar" ; bar ## MODIFIED (layout) + TCODE tbar10, "0 bar" ; bar ## NEW 2.95 + TCODE tMeterMinute, "m/min" ; meter per minute ## ascent speed + TCODE tmin, "min" ; minutes ; Date - TCODE tDateFormat, "Date:" - TCODE tDateformat, "MMDDYY" - TCODE tDateformat1,"DDMMYY" - TCODE tDateformat2,"YYMMDD" + TCODE tDateFormat, "Date:" + TCODE tDateformat, "MMDDYY" + TCODE tDateformat1, "DDMMYY" + TCODE tDateformat2, "YYMMDD" ; Simulator menu - TCODE tInter, "Start Simulator" ; Start Simulator - TCODE tPlan, "Simulator" ; Simulator + TCODE tInter, "Start Simulator" ; Start Simulator + TCODE tPlan, "Simulator" ; Simulator ; Decoplanner submenu - TCODE tBtTm, "Bot. Time:" ; Bot. Time: (10 chars) - TCODE tBtTm_short,"Time:" ; Bot. Time: (max. 6 chars) - TCODE tMxDep, "Max Depth:" ; Max Depth: (10 chars) - TCODE tIntvl, "Interval :" ; Interval : (10 chars) - TCODE tDeco, "Calculate Deco" ; Calculate Deco - TCODE tDivePlan, "Dive Plan:" ; Dive Plan: - TCODE tNoDeco, "No Deco" ; No Deco - TCODE tMore, "More..." ; More... - TCODE tGasUsage, "Gas Usage" ; Gas Usage - TCODE tSetBotUse, "Bottom Gas: " ; Bottom Gas: (space) - TCODE tSetDecoUse,"Deco Gas: " ; Deco Gas: (space) - + TCODE tBtTm, "Bot.Time : " ; Bot. Time: (10 chars) ## MODIFIED (layout) + TCODE tBtTm_short, "Time:" ; Bot. Time: (max. 6 chars) + TCODE tBtDep, "Bot.Depth: " ; Max Depth: (10 chars) ## MODIFIED (layout) + TCODE tIntvl, "Interval : " ; Interval : (10 chars) + TCODE tDecoSetup, "Calculator Setup" ; ## NEW (layout) + TCODE tDeco, "Start Calculator" ; Calculate Deco ## MODIFIED (layout) + TCODE tDivePlan, "Dive Plan:" ; Dive Plan: + TCODE tNoDeco, "No Deco" ; No Deco + TCODE tMore, "More..." ; More... + TCODE tSelectSetpoint,"CCR Setpoint: " ; ## NEW deco calculator enhancement + TCODE tuseAGF, "use aGF: " ; ## NEW deco calculator enhancement + TCODE tCalculating, "Calculating..." ; ## NEW deco calculator enhancement ; Information menu - TCODE tFirmware, "Firmware: " ; Firmware: (space) - TCODE tSerial, "Serial : " ; Serial : (space) - TCODE tTotalDives,"Total Dives: " ; Total Dives: - TCODE tBatteryV, "Battery: " ; Battery: - TCODE tUptime, "Uptime: " ; Uptime: - + TCODE tFirmware, "Firmware: " ; Firmware: (space) + TCODE tSerial, "Serial : " ; Serial : (space) + TCODE tTotalDives, "Total Dives: " ; Total Dives: + TCODE tBatteryV, "Battery : " ; Battery: ## MODIFIED ## info - added one space + TCODE tUptime, "Uptime : " ; Uptime: ## MODIFIED ## info - added two spaces + ; Divemode screen - TCODE tNDL, "NDL" - TCODE tTTS, "TTS" - TCODE tVelMetric, "m/min" - TCODE tVelImperial,"ft/m " - TCODE tGasSelect, "Select Gas" ; Select Gas - TCODE tSelectAir, "Air " ; Air - TCODE tSelectO2, "O2 " ; O2 - TCODE tSelectNx, "Nx" ; Nx - TCODE tSelectTx, "Tx" ; Tx - TCODE tDepth, "Depth" ; Depth - TCODE tMaxDepth, "Max. Depth" ; Max. Depth - max 10chars! - TCODE tDivetime, "Divetime" ; Divetime + TCODE tNDL, "NDL" + TCODE tTTS, "TTS" + TCODE tVelMetric, "m/min" + TCODE tVelImperial, "ft/m " + TCODE tGasSelect, "Select Gas" ; Select Gas + TCODE tSelectAir, "Air " ; Air + TCODE tSelectO2, "O2 " ; O2 + TCODE tSelectNx, "Nx" ; Nx + TCODE tSelectTx, "Tx" ; Tx + TCODE tDepth, "Depth" ; Depth + TCODE tMaxDepth, "Max. Depth" ; Max. Depth - max 10chars! + TCODE tDivetime, "Divetime" ; Divetime TCODE tDiveHudMask1, "Sensor 1" TCODE tDiveHudMask2, "Sensor 2" TCODE tDiveHudMask3, "Sensor 3" TCODE tDiveTotalAvg, "Total Avg" TCODE tDiveStopwatch, "Stopwatch" - TCODE tDiveStopAvg, "Stopped Avg" ; 11chars max - TCODE tApnoeTotal, " Total" ; Total (Six chars, right alligned) - TCODE tApnoeMax, "Last Descent" ; Last descent - TCODE tApnoeSurface, "Surface Time" ; Surface Time - TCODE tDiveDecoplan, "Decoplan" ; Decoplan - TCODE tDiveClock, "Clock" ; Clock - TCODE tDiveEAD_END, "EAD/END" ; EAD/END - TCODE tDiveTissues, "Tissues" ; Tissues - TCODE tEND, "END:" ; END: - TCODE tHe, "He" ; He - TCODE tN2, "N2" ; N2 - TCODE tDiveBailout, "Bailout" ; Bailout - TCODE tGFactors, "GF Values" ; GF Values - TCODE taGFactors, "aGF Values" ; aGF Values - TCODE tGFInfo, "Current GF" ; GF Info - TCODE tCeiling, "Ceiling" ; Ceiling - TCODE tDiveSafetyStop,"Stop" ; Stop (Four chars, right alligned) - TCODE tDiveFallback, "Fallback!" ; Fallback! (max. nine chars) - TCODE tSensorCheck, "Sensor Check" ; Sensor Check - TCODE tdil, "Dil:" ; Diluent ppO2 Warning + TCODE tDiveStopAvg, "Stopped Avg" ; 11chars max + TCODE tApnoeTotal, " Total" ; Total (Six chars, right alligned) + TCODE tApnoeMax, "Last Descent" ; Last descent + TCODE tApnoeSurface, "Surface Time" ; Surface Time + TCODE tDiveDecoplan, "Decoplan" ; Decoplan + TCODE tDiveClock, "Clock" ; Clock + TCODE tDiveEAD_END, "EAD/END" ; EAD/END + TCODE tDiveTissues, "Tissues" ; Tissues + TCODE tEND, "END:" ; END: + TCODE tHe, "He" ; He + TCODE tN2, "N2" ; N2 + TCODE tDiveBailout, "Bailout" ; Bailout + TCODE tGFactors, "GF Values" ; GF Values + TCODE taGFactors, "aGF Values" ; aGF Values + TCODE tGFInfo, "Current GF" ; GF Info + TCODE tCeiling, "Ceiling" ; Ceiling + TCODE tDiveSafetyStop,"Stop" ; Stop (Four chars, right alligned) + TCODE tDiveFallback, "Fallback!" ; Fallback! (max. nine chars) + TCODE tDecoInfo, "Deco Zone" ; Deco info + TCODE tSensorCheck, "Sensor Check" ; Sensor Check + TCODE tdil, "Dil:" ; Diluent ppO2 Warning + TCODE tmix, "Mix:" ; Pre-Mix ppO2 Warning + TCODE tSensorDisagree,"Sensors<>" ; Sensors disagree Warning ## NEW voting logic + TCODE tGasNeedsWarn, "Gas Needs" ; ## NEW bailout gas needs + TCODE tGasNeedsBar, "Gas Needs (bar)" ; ## NEW bailout gas needs + TCODE tCNSsurf, "CNS Surf." ; ## NEW CNS at end-of-dive + TCODE tCNSfTTS, "CNS fTTS" ; ## NEW CNS at end-of-dive + TCODE tCNSBO, "CNS B/O" ; ## NEW CNS at end-of-dive + TCODE tCNSnow, "CNS now" ; ## NEW CNS at end-of-dive + TCODE tCNSeod, "CNS final" ; ## NEW CNS at end-of-dive + TCODE tIBCD, "IBCD N2He" ; ## NEW IBCD + TCODE tMicroBubbles, "M.Bubbles" ; ## NEW microbubbles + TCODE tCNS, "CNS: " ; ## V2.95 optics ; Divemode menu - TCODE tDivePreMenu, "Menu?" ; Menu? - TCODE tSetHeading, "Bearing" ; Bearing (Max. seven chars) + TCODE tDivePreMenu, "Menu?" ; Menu? + TCODE tSetHeading, "Bearing" ; Bearing (Max. seven chars) ; Simulator menu - TCODE tQuitSim, "Quit?" ; Quit Simulation? + TCODE tQuitSim, "Quit?" ; Quit Simulation? ; Logbook - TCODE tCNS2, "CNS:" - TCODE tAVG, "Avg:" - TCODE tGF, "GF:" - TCODE tSAT, "Sat:" ; Sat: + TCODE tCNS2, "CNS:" + TCODE tAVG, "Avg:" + TCODE tGF, "GF:" + TCODE tSAT, "Sat:" ; Sat: ; Logbook units - TCODE tLogTunitC, "°C" - TCODE tLogTunitF, "°F" - TCODE tKGL, "kg/l" - TCODE tMBAR, "mbar" + TCODE tLogTunitC, "°C" + TCODE tLogTunitF, "°F" + TCODE tKGL, "kg/l" + TCODE tMBAR, "mbar" ; Logbook menu - TCODE tNextLog, "Next Page" + TCODE tNextLog, "Next Page" ; Reset menu - TCODE tReboot, "Reboot" ;Reboot - TCODE tResetMenu2,"Are you sure?" ;Are you sure? - TCODE tAbort, "Abort" ;Abort - TCODE tResetSettings, "Reset all" ;Reset all - TCODE tResetDeco, "Reset Deco" ;Reset Deco - TCODE tResetBattery, "Reset Battery" ;Reset Battery - TCODE tResetLogbook, "Reset Logbook" ;Reset Logbook + TCODE tReboot, "Reboot" ; Reboot + TCODE tResetMenu2, "Are you sure?" ; Are you sure? + TCODE tAbort, "Abort" ; Abort + TCODE tResetSettings, "Reset all" ; Reset all + TCODE tResetDeco, "Reset Deco" ; Reset Deco + TCODE tResetBattery, "Reset Battery" ; Reset Battery + TCODE tResetLogbook, "Reset Logbook" ; Reset Logbook ; Set Time Menu/Set Date Menu - TCODE tSetHours, "Set Hours" ; Set Hours - TCODE tSetMinutes,"Set Minutes" ; Set Minutes - TCODE tSetSeconds,"Clear Seconds" ; Clear seconds - TCODE tSetDay, "Set Day" ; Set Day - TCODE tSetMonth, "Set Month" ; Set Month - TCODE tSetYear, "Set Year" ; Set Year + TCODE tSetHours, "Set Hours" ; Set Hours + TCODE tSetMinutes, "Set Minutes" ; Set Minutes + TCODE tSetSeconds, "Clear Seconds" ; Clear seconds + TCODE tSetDay, "Set Day" ; Set Day + TCODE tSetMonth, "Set Month" ; Set Month + TCODE tSetYear, "Set Year" ; Set Year ; Logbook Offset Menu TCODE tLogOffset, "Logbook offset" ; Logbook offset @@ -301,19 +344,14 @@ TCODE tLogOffsetm1, "-1" ; -1 TCODE tLogOffsetm10, "-10" ; -10 -; Sampling rate - TCODE tSamplingrate, "Sampling rate:" ; Sampling rate: - TCODE tSampling2s, "2s" ; 2s - TCODE tSampling10s, "10s" ; 10s - ; Compass directions - TCODE tN, "N " ; N(orth),338°-22° - TCODE tNE, "NE" ; North-East,23°-67° - TCODE tE, "E " ; E(east),68°-112° + TCODE tN, "N " ; N(orth), 338°- 22° + TCODE tNE, "NE" ; North-East, 23°- 67° + TCODE tE, "E " ; E(east), 68°-112° TCODE tSE, "SE" ; South-East,113°-157° - TCODE tS, "S " ; S(outh),158°-202° + TCODE tS, "S " ; S(outh), 158°-202° TCODE tSW, "SW" ; South-West,203°-247° - TCODE tW, "W " ; W(West),248°-292° + TCODE tW, "W " ; W(West), 248°-292° TCODE tNW, "NW" ; North-West,293°-337° ; Color Scheme menu @@ -325,6 +363,6 @@ TCODE tColorSetName3, "Blue" ; Blue ; PSCR Menu and Settings - TCODE tPSCRMenu, "PSCR Menu" ; PSCR Menu - TCODE tPSCR_O2_drop, "O2 drop:" ; O2 drop - TCODE tPSCR_lungratio,"Lung ratio:" ; lung ratio + TCODE tPSCRMenu, "pSCR Setup" ; PSCR Menu ## MODIFIED (consistient naming) + TCODE tPSCR_O2_drop, "O2 drop:" ; O2 drop + TCODE tPSCR_lungratio,"Lung ratio:" ; lung ratio
--- a/src/text_french.inc Wed Dec 27 14:34:11 2017 +0100 +++ b/src/text_french.inc Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= >> OCTC3 V1.13b > ClaudeDive update proposed. ; -; File text_french.asm +; File text_french.asm REFACTORED VERSION V2.95 ; ; French texts translation file. ; @@ -10,6 +10,7 @@ ; Basic texts TCODE tNo, "Non" ; No TCODE tYes, "Oui" ; Yes = No + 1 + TCODE tblank, " " ; (a single space character) ## NEW (layout) ; Surface-mode texts TCODE tBeta, "béta" ; beta @@ -50,6 +51,7 @@ TCODE tCalibrateMenu, "Calibration" ; Calibration TCODE tCalibrationGas, "Cal. Gas O2:" ; Cal. Gas O2: TCODE tCalibrate, "Calibrate" ; Calibrate + TCODE tBack, "back..." ; ## NEW ; Gas menu TCODE tGaslist, "Liste Gaz OC" ; OC Gas List @@ -83,20 +85,20 @@ TCODE tSP, "SP" ; SP (SetPoint) TCODE tSPPlus, "ppO2+" ; pO2+ TCODE tSensorFallback, "Fallback:" ; Fallback: + TCODE tCalculated, "calculated" ; calculated TCODE tppO2, "ppO2:" ; ppO2: TCODE tppO2O2, "ppO2(O2)" ; ppO2(O2) TCODE tppO2Dil, "ppO2(Dil)" ; ppO2(Dil) - - + TCODE tppO2Mix, "ppO2(Mix)" ; ppO2(Mix) + ; New batteries menu TCODE tNewBattTitle, "Nouvelle Batterie?" TCODE tNewBattOld, "Conserver" - TCODE tNewBattNew36, "Réinit. 3.6V Saft" + TCODE tNewBattNew36, "Réinit. 3.6V Saft" TCODE tNewBattNew15, "Réinit. 1.5V AA" TCODE tNewBattAccu, "3.6V LiIon AA" TCODE tNew18650, "Internal 18650" TCODE tNew16650, "Internal 16650" - ; Gaslist management TCODE tGas, "Gaz" ; Gas @@ -116,16 +118,18 @@ ; Dive Settings TCODE tDvMode, "Mode:" TCODE tDvOC, "OC" - TCODE tDvCC, "CC" + TCODE tDvCCR, "CCR" TCODE tDvGauge, "Gauge" TCODE tDvApnea, "Apnée" - TCODE tDvPSCR, "PSCR" - TCODE tDkMode, "Modèle:" - TCODE tZHL16, "ZH-L16" - TCODE tZHL16GF, "ZH-L16+GF" + TCODE tDvPSCR, "pSCR" + TCODE tDvCC, "CC" + TCODE tDkMode, "Modèle:ZH-L16" ; ## MODIFIED (memory) + TCODE tZHL16, " " ; ## MODIFIED (memory) + TCODE tZHL16GF, "+GF" ; ## MODIFIED (memory) TCODE tPPO2Max, "ppO2 Max:" TCODE tPPO2DECO, "ppO2 Déco:" TCODE tPPO2MIN, "ppO2 Min:" + TCODE tPPO2MINCC, "Min Loop:" ; ## NEW ppO2 min cc TCODE tLastDecostop, "Dern.Palier:" TCODE tDecoparameters, "Paramètres Déco" TCODE tGF_low, "GF Bas:" @@ -140,6 +144,20 @@ TCODE tDiveaGF_active,"aGF!" ; aGF! TCODE tppO2settings,"Menu ppO2" ; ppO2 Settings (max. 18 chars) TCODE tsafetystopmenu,"Palier sécurité:" ; Safety Stop: (max. 16 chars) + TCODE tGasUsage, "Gas Usage" ; Gas Usage + TCODE tSetBotUse, "Bottom Gas: " ; Bottom Gas: (space) + TCODE tSetDecoUse, "Deco Gas: " ; Deco Gas: (space) ## MODIFIED (layout) + TCODE tCalcAscGas, "Calc.Gas (B/O):" ; ## NEW bailout gas needs + TCODE tTankSizes, "Tank Sizes" ; ## NEW bailout gas needs + TCODE tLiter, " l" ; ## NEW bailout gas needs + TCODE tTankFillPress, "Tank Press Budget"; ## NEW bailout gas needs + TCODE tGas1, "Gas 1:" ; ## NEW bailout gas needs + TCODE tGas2, "Gas 2:" ; ## NEW bailout gas needs + TCODE tGas3, "Gas 3:" ; ## NEW bailout gas needs + TCODE tGas4, "Gas 4:" ; ## NEW bailout gas needs + TCODE tGas5, "Gas 5:" ; ## NEW bailout gas needs + TCODE tCCmaxFracO2, "Loop %O2 max.:" ; ## NEW CCR max ppO2 limiter + TCODE t2ndDecoPlanMenu,"2nd Deco Plan" ; ## NEW deco engine ; Display Settings TCODE tBright, "Luminosité:" @@ -147,9 +165,10 @@ TCODE tMedium, "Moyenne" TCODE tHigh, "Haute" TCODE tDvSalinity,"Salinité:" ; Salinity + TCODE tShowppO2, "Afficher ppO2:" ; Always show ppO2: TCODE tFlip, "Pivoter l'écran:" ; Rotate Screen TCODE tMODwarning,"Alerte MOD:" ; MOD warning - TCODE tShowppO2, "Afficher ppO2:" ; Always show ppO2: + TCODE tIBCDwarning, "IBCD Warning :" ; IBCD Warning ## NEW IBCD TCODE tTimeoutDive,"Dive Timeout:" ; Dive Timeout ; VSI display Settings @@ -169,17 +188,21 @@ TCODE tCalY, "Cal Y:" ; Cal Y TCODE tCalZ, "Cal Z:" ; Cal Z - TCODE tUnits, "Unités:" TCODE tMetric, " m/°C" ; Enum menu TCODE tImperial, "ft/°F" TCODE tDefName, "HW OSTC" - TCODE tbar, "bar" ; bar TCODE tButtonleft,"Bouton gauche:" ; Left button TCODE tButtonright,"Bouton droit:" ; Right button + TCODE tAltMode, "Waiting Time:" ; ## NEW no fly altitude + TCODE tAltModeFly, "Flying" ; ## NEW no fly altitude + TCODE tAltMode1000, "1000m" ; ## NEW no fly altitude + TCODE tAltMode2000, "2000m" ; ## NEW no fly altitude + TCODE tAltMode3000, "3000m" ; ## NEW no fly altitude + ; Units for all menu TCODE tMeters, "m" TCODE tFeets, "ft" @@ -187,7 +210,11 @@ TCODE tMinutes, "'" TCODE tPercent, "%" TCODE tLitersMinute, "l/min" - + TCODE tbar, "bar" ; bar + TCODE tbar10, "0 bar" ; bar ## NEW 2.95 + TCODE tMeterMinute, "m/min" ; meter per minute ## ascent speed + TCODE tmin, "min" ; minutes + ; Date TCODE tDateFormat, "Date:" TCODE tDateformat, "MMJJAA" @@ -203,14 +230,14 @@ TCODE tBtTm_short,"Temps:" ; Bot. Time: (max. 6 chars) TCODE tMxDep, "Prof. Max:" ; Max Depth: (10 chars) TCODE tIntvl, "Intervalle:" ; Interval : (10 chars) + TCODE tDecoSetup, "Calculator Setup" ; ## NEW (layout) TCODE tDeco, "Calcul Déco" ; Calculate Deco TCODE tDivePlan, "Runtime:" ; Dive Plan: TCODE tNoDeco, "No Déco" ; No Deco TCODE tMore, "Suite..." ; More... - TCODE tGasUsage, "Util. Gaz" ; Gas Usage - TCODE tSetBotUse, "Gaz Fond: " ; Bottom Gas: (space) - TCODE tSetDecoUse,"Gaz Déco: " ; Deco Gas: (space) - + TCODE tSelectSetpoint,"CCR Setpoint: " ; ## NEW deco calculator enhancement + TCODE tuseAGF, "use aGF: " ; ## NEW deco calculator enhancement + TCODE tCalculating, "Calculating..." ; ## NEW deco calculator enhancement ; Information menu TCODE tFirmware, "Logiciel: " ; Firmware: (space) @@ -253,11 +280,24 @@ TCODE taGFactors, "Valeurs aGF" ; aGF Values TCODE tGFInfo, " GF Info" ; GF Info TCODE tCeiling, "Ceiling" ; Ceiling - TCODE tDiveSafetyStop,"Stop" ; Stop (Four chars, right alligned) + TCODE tDiveSafetyStop,"Stop" ; Stop (Four chars, right alligned) TCODE tDiveFallback, "Fallback!" ; Fallback! (max. nine chars) + TCODE tDecoInfo, "Deco Zone" ; Deco info TCODE tSensorCheck, "Sensor Check" ; Sensor Check - TCODE tdil, "Dil:" ; Diluent ppO2 Warning - + TCODE tdil, "Dil:" ; Diluent ppO2 Warning + TCODE tmix, "Mix:" ; Pre-Mix ppO2 Warning + TCODE tSensorDisagree,"Sensors<>" ; Sensors disagree Warning ## NEW voting logic + TCODE tGasNeedsWarn, "Gas Needs" ; ## NEW bailout gas needs + TCODE tGasNeedsBar, "Gas Needs (bar)" ; ## NEW bailout gas needs + TCODE tCNSsurf, "CNS Surf." ; ## NEW CNS at end-of-dive + TCODE tCNSfTTS, "CNS fTTS" ; ## NEW CNS at end-of-dive + TCODE tCNSBO, "CNS B/O" ; ## NEW CNS at end-of-dive + TCODE tCNSnow, "CNS now" ; ## NEW CNS at end-of-dive + TCODE tCNSeod, "CNS final" ; ## NEW CNS at end-of-dive + TCODE tIBCD, "IBCD N2He" ; ## NEW IBCD + TCODE tMicroBubbles, "M.Bubbles" ; ## NEW microbubbles + TCODE tCNS, "CNS: " ; ## V2.95 optics + ; Divemode menu TCODE tDivePreMenu, "Menu?" ; Menu? TCODE tSetHeading, "Cap" ; Bearing (Max. seven chars) @@ -304,11 +344,6 @@ TCODE tLogOffsetm1, "-1" ; -1 TCODE tLogOffsetm10, "-10" ; -10 -; Sampling rate - TCODE tSamplingrate, "Fréq. Mesures:" ; Sampling rate: - TCODE tSampling2s, "2s" ; 2s - TCODE tSampling10s, "10s" ; 10s - ; Compass directions TCODE tN, "N " ; N(orth),338°-22° TCODE tNE, "NE" ; North-East,23°-67° @@ -331,5 +366,3 @@ TCODE tPSCRMenu, "PSCR Menu" ; PSCR Menu TCODE tPSCR_O2_drop, "O2 drop:" ; O2 drop TCODE tPSCR_lungratio,"Lung ratio:" ; lung ratio - -
--- a/src/text_german.inc Wed Dec 27 14:34:11 2017 +0100 +++ b/src/text_german.inc Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File text_german.asm +; File text_german.asm REFACTORED VERSIOn V2.95 ; ; German texts translation file. ; @@ -8,85 +8,88 @@ ;============================================================================= ; Basic texts - TCODE tNo, "Nein" ; No - TCODE tYes, "Ja" ; Yes = No + 1 - + TCODE tNo, "Nein" ; No + TCODE tYes, "Ja" ; Yes = No + 1 + TCODE tblank, " " ; (a single space character) + ; Surface-mode texts - TCODE tBeta, "beta" ; beta - TCODE tMenu, "<Menü" ; <Menu - TCODE tView, "View>" ; View> - TCODE tHeading, "Kurs:" ; Heading: - TCODE tLastDive, "Letzter TG" ; Last Dive (Max 10 chars) - TCODE tSensorMilliVolt, "CCR Sensoren mV" ; CCR Sensors mV + TCODE tBeta, "beta" ; beta + TCODE tMenu, "<Menü" ; <Menu + TCODE tView, "View>" ; View> + TCODE tHeading, "Kurs:" ; Heading: + TCODE tLastDive, "Letzter TG" ; Last Dive (Max 10 chars) + TCODE tSensorMilliVolt, "CCR Sensoren mV" ; CCR Sensors mV ; Divemode Menu - TCODE tDivemenu_Gaslist, "Gasliste" ; Gaslist - TCODE tDivemenu_ResetAvg, "Stoppuhr" ; Reset Avg. - TCODE tDivemenu_Setpoint, "Setpoint" ; Setpoint - TCODE tDivemenu_UseSensor,"Akt. Sensor" ; Use Sensor - TCODE tDivemenu_ToggleGF, "Toggle GF" ; Toggle GF - TCODE tDivemenu_Marker, "Markierung" ; Set Marker - TCODE tDivemenu_LostGas, "Gasverlust" ; Lost Gas + TCODE tDivemenu_Gaslist, "Gasliste" ; Gaslist + TCODE tDivemenu_ResetAvg, "Stoppuhr" ; Reset Avg. + TCODE tDivemenu_Setpoint, "Setpoint" ; Setpoint + TCODE tDivemenu_UseSensor,"akt. Sensor" ; Use Sensor + TCODE tDivemenu_ToggleGF, "Toggle GF" ; Toggle GF + TCODE tDivemenu_Marker, "Markierung" ; Set Marker + TCODE tDivemenu_LostGas, "Gasverlust" ; Lost Gas ; Main menu - TCODE tNext, "<Weiter" ; <Next - TCODE tEnter, "Enter>" ; Enter> + TCODE tNext, "<Weiter" ; <Next + TCODE tEnter, "Enter>" ; Enter> - TCODE tMainMenu, "Hauptmenü" ; MainMenu - TCODE tLogbook, "Logbuch" ; Logbook - TCODE tGasSetup, "OC Gas Setup" ; OC Gas Setup - TCODE tSetTime, "Zeit stellen" ; Set Time - TCODE tSetDate, "Datum stellen" ; Set Date - TCODE tSetTimeDate,"Datum & Uhrzeit"; Set Time & Date - TCODE tDispSets, "Anzeige" ; Display Settings - TCODE tExit, "Ende" ; Exit - TCODE tResetMenu, "Reset Menü" ; Reset Menu - TCODE tDiveModeMenu,"Dekoberechnung" ; Deco Mode - TCODE tInfoMenu, "Informationen" ; Information - TCODE tCCRSetup, "CCR Menü" ; CCR Setup - TCODE tDiluentSetup,"Diluent Menü" ; Diluent Setup - TCODE tFixedSetpoints,"Feste Setpoints" ; Fixed Setpoints - TCODE tCCRSensor, "CCR Sensor" ; CCR Sensor - TCODE tCalibrateMenu, "Kalibrierung" ; Calibration - TCODE tCalibrationGas, "Kal. Gas O2:" ; Cal. Gas O2: - TCODE tCalibrate, "Kalibrieren" ; Calibrate + TCODE tMainMenu, "Hauptmenü" ; MainMenu + TCODE tLogbook, "Logbuch" ; Logbook + TCODE tGasSetup, "OC Gas Setup" ; OC Gas Setup + TCODE tSetTime, "Zeit stellen" ; Set Time + TCODE tSetDate, "Datum stellen" ; Set Date + TCODE tSetTimeDate, "Datum & Uhrzeit" ; Set Time & Date + TCODE tDispSets, "Anzeige" ; Display Settings + TCODE tExit, "Ende" ; Exit + TCODE tResetMenu, "Reset Menü" ; Reset Menu + TCODE tDiveModeMenu, "Deko Einstellung" ; Deco Mode + TCODE tInfoMenu, "Informationen" ; Information + TCODE tCCRSetup, "CCR/pSCR Menü" ; CCR Setup + TCODE tDiluentSetup, "Diluent Menü" ; Diluent Setup + TCODE tFixedSetpoints, "CCR Setpoints" ; Fixed Setpoints + TCODE tCCRSensor, "Sensor" ; CCR/pSCR Sensor + TCODE tCalibrateMenu, "Kalibrierung" ; Calibration + TCODE tCalibrationGas, "Kal. Gas O2:" ; Cal. Gas O2: + TCODE tCalibrate, "Kalibrieren" ; Calibrate + TCODE tBack, "zurück..." ; Gas menu - TCODE tGaslist, "OC Gas Liste" - TCODE tGaslistCC, "CC Gas Liste" ; CC Diluents - TCODE tGasEdit, "Gas einstellen" - TCODE tType, "Type: " - TCODE tGasDisabled,"Deaktiviert" ; Disabled - TCODE tGasFirst, "Start" ; First - TCODE tGasTravel, "Reise" ; Travel - TCODE tGasDeco, "Deko" ; Deco - TCODE tDilDisabled,"Deaktiviert" ; Disabled - TCODE tDilFirst, "Start" ; First - TCODE tDilNorm, "Normal" ; Normal - TCODE tAir, "Luft " ; Enum: values must follows (5 chars) - TCODE tO2, "O2 " ; tAir + 5 - TCODE tO2Plus, "O2 +" - TCODE tO2Minus, "O2 -" - TCODE tHePlus, "He +" - TCODE tHeMinus, "He -" - TCODE tMOD, "MOD:" - TCODE tEAD, "EAD:" - TCODE tGasDepth, "Wechseltiefe" - TCODE tDepthPlus, "Tiefe +" - TCODE tDepthMinus,"Tiefe -" - TCODE tDepthReset,"Reset auf MOD:" - TCODE tSetup_mix, "Mix Einstellen" - TCODE tCCRMode, "CCR Modus:" ; CCR Mode: - TCODE tCCRModeFixedSP, "Fester SP" ; Fixed SP - TCODE tCCRModeSensor, "Sensor" ; Sensor - TCODE tCCRModeAutoSP, "Auto SP" ; Auto SP - TCODE tSP, "SP" ; SP (SetPoint) - TCODE tSPPlus, "ppO2+" ; pO2+ - TCODE tSensorFallback, "Fallback:" ; Fallback: - TCODE tppO2, "ppO2:" ; ppO2: - TCODE tppO2O2, "ppO2(O2)" ; ppO2(O2) - TCODE tppO2Dil, "ppO2(Dil)" ; ppO2(Dil) - + TCODE tGaslist, "OC Gas Liste" + TCODE tGaslistCC, "CC Gas Liste" ; CC Diluents + TCODE tGasEdit, "Gas einstellen" + TCODE tType, "Type: " + TCODE tGasDisabled, "Deaktiviert" ; Disabled + TCODE tGasFirst, "Start" ; First + TCODE tGasTravel, "Reise" ; Travel + TCODE tGasDeco, "Deko" ; Deco + TCODE tDilDisabled, "Deaktiviert" ; Disabled + TCODE tDilFirst, "Start" ; First + TCODE tDilNorm, "Normal" ; Normal + TCODE tAir, "Luft " ; Enum: values must follows (5 chars) + TCODE tO2, "O2 " ; tAir + 5 + TCODE tO2Plus, "O2 +" + TCODE tO2Minus, "O2 -" + TCODE tHePlus, "He +" + TCODE tHeMinus, "He -" + TCODE tMOD, "MOD:" + TCODE tEAD, "EAD:" + TCODE tGasDepth, "Wechseltiefe" + TCODE tDepthPlus, "Tiefe +" + TCODE tDepthMinus, "Tiefe -" + TCODE tDepthReset, "Reset auf MOD:" + TCODE tSetup_mix, "Mix Einstellen" + TCODE tCCRMode, "Modus:" ; Mode: + TCODE tCCRModeFixedSP, "fixeSP/Berech." ; Fixed SP + TCODE tCCRModeSensor, "Sensor" ; Sensor + TCODE tCCRModeAutoSP, "Auto SP" ; Auto SP + TCODE tSP, "SP" ; SP (SetPoint) + TCODE tSPPlus, "ppO2+" ; pO2+ + TCODE tSensorFallback, "Fallback:" ; Fallback: + TCODE tCalculated, "berechnet" ; calculated + TCODE tppO2, "ppO2:" ; ppO2: + TCODE tppO2O2, "ppO2(O2)" ; ppO2(O2) + TCODE tppO2Dil, "ppO2(Dil)" ; ppO2(Dil) + TCODE tppO2Mix, "ppO2(Mix)" ; ppO2(Mix) ; New batteries menu TCODE tNewBattTitle, "Neue Batterie?" @@ -94,238 +97,272 @@ TCODE tNewBattNew36, "Neue 3,6V Saft" TCODE tNewBattNew15, "Neue 1,5V AA" TCODE tNewBattAccu, "3,6V AA Akku" - TCODE tNew18650, "Interne 18650" - TCODE tNew16650, "Interne 16650" + TCODE tNew18650, "Interne 18650" + TCODE tNew16650, "Interne 16650" ; Gaslist management - TCODE tGas, "Gas" ; Gas - TCODE tGasErr, "Err" ; Err (3 chars) + TCODE tGas, "Gas" ; Gas + TCODE tGasErr, "Err" ; Err (3 chars) ; Communication Menu - TCODE tUsbTitle, "USB Modus" - TCODE tBleTitle, "Bluetooth Modus" - TCODE tUsbStarting, "Starte....." - TCODE tUsbStartDone, "Fertig." - TCODE tUsbServiceMode, "Servicemodus aktiv" - TCODE tUsbClosed, "Abgebrochen" - TCODE tUsbExit, "Beendet" - TCODE tUsbDownloadMode, "Downloadmodus aktiv" - TCODE tUsbLlBld, "Low-Level Bootloader" + TCODE tUsbTitle, "USB Modus" + TCODE tBleTitle, "Bluetooth Modus" + TCODE tUsbStarting, "Starte....." + TCODE tUsbStartDone, "Fertig." + TCODE tUsbServiceMode, "Servicemodus aktiv" + TCODE tUsbClosed, "Abgebrochen" + TCODE tUsbExit, "Beendet" + TCODE tUsbDownloadMode, "Downloadmodus aktiv" + TCODE tUsbLlBld, "Low-Level Bootloader" ; Dive Settings - TCODE tDvMode, "Betrieb:" - TCODE tDvOC, "OC" - TCODE tDvCC, "CC" - TCODE tDvGauge, "Gauge" - TCODE tDvApnea, "Apnoe" - TCODE tDvPSCR, "PSCR" - TCODE tDkMode, "Dekotyp:" - TCODE tZHL16, "ZH-L16" - TCODE tZHL16GF, "ZH-L16+GF" - TCODE tPPO2Max, "ppO2 Max:" - TCODE tPPO2DECO, "ppO2 Deko:" - TCODE tPPO2MIN, "ppO2 Min:" - TCODE tLastDecostop, "Letzt. Stop:" - TCODE tDecoparameters, "Deko Parameter" - TCODE tGF_low, "GF low:" - TCODE tGF_high, "GF high:" - TCODE tSaturationMult, "Sättigung:" + TCODE tDvMode, "Betrieb:" + TCODE tDvOC, "OC" + TCODE tDvCCR, "CCR" + TCODE tDvGauge, "Gauge" + TCODE tDvApnea, "Apnoe" + TCODE tDvPSCR, "pSCR" + TCODE tDvCC, "CC" + TCODE tDkMode, "Decotype:ZH-L16" ; ## MODIFIED (memory needs) + TCODE tZHL16, " " ; keep order, enum from here... ## MODIFIED (memory needs) + TCODE tZHL16GF, "+GF" ; ...up to here! ## MODIFIED (memory needs) + TCODE tPPO2Max, "Max. :" + TCODE tPPO2DECO, "Max. Deko:" + TCODE tPPO2MIN, "Min. :" + TCODE tPPO2MINCC, "Min. Loop:" + TCODE tLastDecostop, "Letzt.Stop:" + TCODE tDecoparameters, "Deko Parameter" + TCODE tGF_low, "GF low :" + TCODE tGF_high, "GF high:" + TCODE tSaturationMult, "Sättigung :" TCODE tDesaturationMult, "Entsättigung:" - TCODE tFTTSMenu, "Future TTS:" ; Future TTS - TCODE taGFMenu, "Alternativ-GF" ; Alternative GF - TCODE taGF_low, "aGF low:" ; aGF low - TCODE taGF_high, "aGF high:" ; aGF high - TCODE taGF_enable,"aGF wählbar:" ; aGF Selectable - TCODE tDiveaGF_active,"aGF aktiv" ; aGF Active - TCODE tppO2settings,"ppO2 Parameter" ; ppO2 Settings - TCODE tsafetystopmenu,"Sicherheitsstop:" ; Safety Stop: - + TCODE tFTTSMenu, "fTTS/Verz.:" ; Future TTS + TCODE taGFMenu, "Alternativ-GF" ; Alternative GF + TCODE taGF_low, "aGF low :" ; aGF low + TCODE taGF_high, "aGF high:" ; aGF high + TCODE taGF_enable, "aGF wählbar:" ; aGF Selectable + TCODE tDiveaGF_active, "aGF aktiv" ; aGF Active + TCODE tppO2settings, "ppO2 Parameter" ; ppO2 Settings + TCODE tsafetystopmenu, "Sicherheitsstop:" ; Safety Stop: + TCODE tGasUsage, "Gas Usage" ; Gas Usage + TCODE tSetBotUse, "Reise Gas: " ; Bottom Gas: (space) + TCODE tSetDecoUse, "Deko Gas: " ; Deco Gas: (space) + TCODE tCalcAscGas, "Gasmenge(B/O):" + TCODE tTankSizes, "Tank Größen" + TCODE tLiter, " l" + TCODE tTankFillPress, "Tank Nutzmenge" + TCODE tGas1, "Gas 1:" + TCODE tGas2, "Gas 2:" + TCODE tGas3, "Gas 3:" + TCODE tGas4, "Gas 4:" + TCODE tGas5, "Gas 5:" + TCODE tCCmaxFracO2, "Loop %O2 max.:" + TCODE t2ndDecoPlanMenu, "2.Deko Plan" + ; Display Settings - TCODE tBright, "Helligkeit:" - TCODE tEco, "Eco" - TCODE tMedium, "Mittel" - TCODE tHigh, "Hoch" - TCODE tDvSalinity,"Salinität:" ; Salinity - TCODE tFlip, "Anzeige drehen:" ; Rotate Screen - TCODE tMODwarning,"MOD Warnung:" ; MOD warning - TCODE tShowppO2, "ppO2 Dauerhaft:" ; Always show ppO2: - TCODE tTimeoutDive,"TG-Ende nach:" ; Dive Timeout + TCODE tBright, "Helligkeit:" + TCODE tEco, "Eco" + TCODE tMedium, "Mittel" + TCODE tHigh, "Hoch" + TCODE tDvSalinity, "Salinität: " ; Salinity + TCODE tShowppO2, "ständig zeigen:" ; Always show ppO2: + TCODE tFlip, "Anzeige drehen:" ; Rotate Screen + TCODE tMODwarning, "MOD Warnung:" ; MOD warning + TCODE tIBCDwarning, "IBCD Warnung:" ; IBCD Warning + TCODE tTimeoutDive, "TG-Ende nach:" ; Dive Timeout ; VSI display Settings - TCODE tVSItext2, "Variable Geschw.:" ; Variable speed: - TCODE tVSIgraph, "Geschw. Grafik:" ; Speed graph: + TCODE tVSItext2, "Variable Geschw.:" ; Variable speed: + TCODE tVSIgraph, "Geschw. Grafik :" ; Speed graph: ; Setup Menu - TCODE tSystSets, "Konfiguration" - TCODE tLanguage, "Sprache:" - TCODE tEnglish, "Englisch" - TCODE tGerman, "Deutsch" - TCODE tFrench, "Französisch" - TCODE tItalian, "Italienisch" - TCODE tCompassMenu,"Kompass-Kalibrierung" ; Compass calibration - TCODE tCompassGain,"Empfindlichkeit:" ; Compass gain: - TCODE tCalX, "Kal. X:" ; Cal X - TCODE tCalY, "Kal. Y:" ; Cal Y - TCODE tCalZ, "Kal. Z:" ; Cal Z + TCODE tSystSets, "Konfiguration" + TCODE tLanguage, "Sprache:" + TCODE tEnglish, "Englisch" + TCODE tGerman, "Deutsch" + TCODE tFrench, "Französisch" + TCODE tItalian, "Italienisch" + TCODE tCompassMenu, "Kompass-Kalibrierung" ; Compass calibration + TCODE tCompassGain, "Empfindlichkeit:" ; Compass gain: + TCODE tCalX, "Kal. X:" ; Cal X + TCODE tCalY, "Kal. Y:" ; Cal Y + TCODE tCalZ, "Kal. Z:" ; Cal Z + TCODE tUnits, "Einheiten:" + TCODE tMetric, " m/°C" ; Enum menu + TCODE tImperial, "ft/°F" + + TCODE tDefName, "HW OSTC" - TCODE tUnits, "Einheiten:" - TCODE tMetric, " m/°C" ; Enum menu - TCODE tImperial, "ft/°F" - - TCODE tDefName, "HW OSTC" - TCODE tbar, "bar" ; bar + TCODE tButtonleft, "Taster links :" ; Left button + TCODE tButtonright, "Taster rechts:" ; Right button - TCODE tButtonleft,"Taster links:" ; Left button - TCODE tButtonright,"Taster rechts:" ; Right button - + TCODE tAltMode, "Wartezeit:" + TCODE tAltModeFly, "Fliegen" + TCODE tAltMode1000, "1000m" + TCODE tAltMode2000, "2000m" + TCODE tAltMode3000, "3000m" + ; Units for all menu - TCODE tMeters, "m" - TCODE tFeets, "ft" - TCODE tFeets1, "f" - TCODE tMinutes, "'" - TCODE tPercent, "%" - TCODE tLitersMinute, "l/min" + TCODE tMeters, "m" + TCODE tFeets, "ft" + TCODE tFeets1, "f" + TCODE tMinutes, "'" + TCODE tPercent, "%" + TCODE tLitersMinute, "l/min" + TCODE tbar, " bar" ; bar + TCODE tbar10, "0 bar" ; bar ## NEW 2.95 + TCODE tMeterMinute, "m/min" ; meter per minute ## ascent speed + TCODE tmin, "min" ; minutes ; Date - TCODE tDateFormat, "Datum:" - TCODE tDateformat, "MMTTJJ" - TCODE tDateformat1,"TTMMJJ" - TCODE tDateformat2,"JJMMTT" + TCODE tDateFormat, "Datum:" + TCODE tDateformat, "MMTTJJ" + TCODE tDateformat1, "TTMMJJ" + TCODE tDateformat2, "JJMMTT" ; Simulator menu - TCODE tInter, "Start Simulator" ; Start Simulator - TCODE tPlan, "Simulator" ; Simulator + TCODE tInter, "Start Simulator" ; Start Simulator + TCODE tPlan, "Simulator" ; Simulator ; Decoplanner submenu - TCODE tBtTm, "Grundzeit:" ; Bot. Time: (10 chars) - TCODE tBtTm_short,"Zeit:" ; Bot. Time: (max. 6 chars) - TCODE tMxDep, "Max.Tiefe:" ; Max Depth: (10 chars) - TCODE tIntvl, "Intervall:" ; Interval : (10 chars) - TCODE tDeco, "Deko berechnen" ; Calculate Deco - TCODE tDivePlan, "Tauchplan:" ; Dive Plan: - TCODE tNoDeco, "Keine Deko" ; No Deco - TCODE tMore, "Mehr..." ; More... - TCODE tGasUsage, "Verbrauch" ; Gas Usage - TCODE tSetBotUse, "Reise Gas: " ; Bottom Gas: (space) - TCODE tSetDecoUse,"Deko Gas: " ; Deco Gas: (space) + TCODE tBtTm, "Grundzeit:" ; Bot. Time: (10 chars) + TCODE tBtTm_short, "Zeit:" ; Bot. Time: (max. 6 chars) + TCODE tMxDep, "Tiefe :" ; Max Depth: (10 chars) + TCODE tIntvl, "Intervall:" ; Interval : (10 chars) + TCODE tDecoSetup, "Deko Parameter" + TCODE tDeco, "Deko Berechnung" ; Calculate Deco + TCODE tDivePlan, "Tauchplan:" ; Dive Plan: + TCODE tNoDeco, "Keine Deko" ; No Deco + TCODE tMore, "Mehr..." ; More... + TCODE tSelectSetpoint, "CCR Setpoint: " + TCODE tuseAGF, "Benutze aGF : " + TCODE tCalculating, "Berechnung läuft..." ; Information menu - TCODE tFirmware, "Firmware: " ; Firmware: (space) - TCODE tSerial, "Seriennr.: " ; Serial : (space) - TCODE tTotalDives,"Anzahl TG: " ; Total Dives: - TCODE tBatteryV, "Batterie: " ; Battery: - TCODE tUptime, "Uptime: " ; Uptime: + TCODE tFirmware, "Firmware: " ; Firmware: (space) + TCODE tSerial, "Seriennr: " ; Serial : (space) ## MODIFIED ## info - removed dot + TCODE tTotalDives, "Anzahl TG: " ; Total Dives: + TCODE tBatteryV, "Batterie: " ; Battery: + TCODE tUptime, "Laufzeit: " ; Uptime: ; Divemode screen - TCODE tNDL, " NZ" - TCODE tTTS, "TTS" - TCODE tVelMetric, "m/min" - TCODE tVelImperial,"ft/m " - TCODE tGasSelect, "Wähle Gas" ; Select Gas - TCODE tSelectAir, "Air " ; Air - TCODE tSelectO2, "O2 " ; O2 - TCODE tSelectNx, "Nx" ; Nx - TCODE tSelectTx, "Tx" ; Tx - TCODE tDepth, "Tiefe" ; Depth - TCODE tMaxDepth, "Max. Tiefe" ; Max. Depth - max 10chars! - TCODE tDivetime, " Zeit" ; Divetime - TCODE tDiveHudMask1, "Sensor 1" - TCODE tDiveHudMask2, "Sensor 2" - TCODE tDiveHudMask3, "Sensor 3" - TCODE tDiveTotalAvg, "Durchschn.1" - TCODE tDiveStopwatch, "Stoppuhr" - TCODE tDiveStopAvg, "Durchschn.2" ; 11chars max - TCODE tApnoeTotal, " Total" ; Total (Six chars, right alligned) - TCODE tApnoeMax, " Letzter TG" ; Last descend - TCODE tApnoeSurface, "Oberflächenzeit" ; Surface Time - TCODE tDiveDecoplan, "Dekoplan" ; Decoplan - TCODE tDiveClock, "Uhr" ; Clock - TCODE tDiveEAD_END, "EAD/END" ; EAD/END - TCODE tDiveTissues, "Gewebe" ; Tissues - TCODE tEND, "END:" ; END: - TCODE tHe, "He" ; He - TCODE tN2, "N2" ; N2 - TCODE tDiveBailout, "Bailout" ; Bailout - TCODE tGFactors, "GF Values" ; GF Values - TCODE taGFactors, "aGF Values" ; aGF Values - TCODE tGFInfo, "GF Info" ; GF Info - TCODE tCeiling, "Ceiling" ; Ceiling - TCODE tDiveSafetyStop,"Stop" ; Stop (Four chars, right alligned) - TCODE tDiveFallback, "Fallback!" ; Fallback! (max. nine chars) - TCODE tSensorCheck, "Sensor Test" ; Sensor Check - TCODE tdil, "Dil:" ; Diluent ppO2 Warning - + TCODE tNDL, " NZ" + TCODE tTTS, "TTS" + TCODE tVelMetric, "m/min" + TCODE tVelImperial, "ft/m " + TCODE tGasSelect, "Wähle Gas" ; Select Gas + TCODE tSelectAir, "Air " ; Air + TCODE tSelectO2, "O2 " ; O2 + TCODE tSelectNx, "Nx" ; Nx + TCODE tSelectTx, "Tx" ; Tx + TCODE tDepth, "Tiefe" ; Depth + TCODE tMaxDepth, "Max. Tiefe" ; Max. Depth - max 10chars! + TCODE tDivetime, " Zeit" ; Divetime + TCODE tDiveHudMask1, "Sensor 1" + TCODE tDiveHudMask2, "Sensor 2" + TCODE tDiveHudMask3, "Sensor 3" + TCODE tDiveTotalAvg, "Durchschn.1" + TCODE tDiveStopwatch, "Stoppuhr" + TCODE tDiveStopAvg, "Durchschn.2" ; 11chars max + TCODE tApnoeTotal, " Total" ; Total (Six chars, right alligned) + TCODE tApnoeMax, " Letzter TG" ; Last descend + TCODE tApnoeSurface, "Oberflächenzeit" ; Surface Time + TCODE tDiveDecoplan, "Dekoplan" ; Decoplan + TCODE tDiveClock, "Uhr" ; Clock + TCODE tDiveEAD_END, "EAD/END" ; EAD/END + TCODE tDiveTissues, "Gewebe" ; Tissues + TCODE tEND, "END:" ; END: + TCODE tHe, "He" ; He + TCODE tN2, "N2" ; N2 + TCODE tDiveBailout, "Bailout" ; Bailout + TCODE tGFactors, "GF Werte" ; GF Values + TCODE taGFactors, "aGF Werte" ; aGF Values + TCODE tGFInfo, "GF jetzt" ; GF Info + TCODE tCeiling, "Ceiling" ; Ceiling + TCODE tDiveSafetyStop, "Stop" ; Stop (Four chars, right alligned) + TCODE tDiveFallback, "Fallback!" ; Fallback! (max. nine chars) + TCODE tDecoInfo, "Deko Zone" ; Deco info + TCODE tSensorCheck, "Sensor Test" ; Sensor Check + TCODE tdil, "Dil:" ; Diluent ppO2 Warning + TCODE tmix, "Mix:" ; Pre-Mix ppO2 Warning + TCODE tSensorDisagree, "Sensoren!" ; Sensors disagree Warning + TCODE tGasNeedsWarn, "Gasbedarf" + TCODE tGasNeedsBar, "Gas Bedarf (bar)" + TCODE tCNSsurf, "ZNS Oberfl." + TCODE tCNSfTTS, "ZNS fTTS" + TCODE tCNSBO, "ZNS B/O" + TCODE tCNSnow, "ZNS jetzt" + TCODE tCNSeod, "ZNS Ende" + TCODE tIBCD, "IBCD N2He" + TCODE tMicroBubbles, "M.Blasen" + TCODE tCNS, "CNS: " + ; Divemode menu - TCODE tDivePreMenu, "Menü?" ; Menu? - TCODE tSetHeading, "Peilung" ; Bearing (Max. seven chars) + TCODE tDivePreMenu, "Menü?" ; Menu? + TCODE tSetHeading, "Peilung" ; Bearing (Max. seven chars) ; Simulator menu - TCODE tQuitSim, "Ende?" ; Quit Simulation? + TCODE tQuitSim, "Ende?" ; Quit Simulation? ; Logbook - TCODE tCNS2, "ZNS:" - TCODE tAVG, "Mit:" - TCODE tGF, "GF:" - TCODE tSAT, "Sät:" ; Sat: + TCODE tCNS2, "ZNS:" + TCODE tAVG, "Mit:" + TCODE tGF, "GF:" + TCODE tSAT, "Sät:" ; Sat: ; Logbook units - TCODE tLogTunitC, "°C" - TCODE tLogTunitF, "°F" - TCODE tKGL, "kg/l" - TCODE tMBAR, "mbar" + TCODE tLogTunitC, "°C" + TCODE tLogTunitF, "°F" + TCODE tKGL, "kg/l" + TCODE tMBAR, "mbar" ; Logbook menu - TCODE tNextLog, "Nächste Seite" + TCODE tNextLog, "Nächste Seite" ; Reset menu - TCODE tReboot, "Neu starten" ;Reboot - TCODE tResetMenu2,"Sind Sie sicher?" ;Are you sure? - TCODE tAbort, "Abbrechen" ;Abort - TCODE tResetSettings, "Alles zurücksetzen";Reset all - TCODE tResetDeco, "Deko zurücksetzen" ;Reset Deco - TCODE tResetBattery, "Batterie zurücksetzen" ;Reset Battery - TCODE tResetLogbook, "Logbuch zurücksetzen" ;Reset Logbook + TCODE tReboot, "Neu starten" ;Reboot + TCODE tResetMenu2, "Sind Sie sicher?" ;Are you sure? + TCODE tAbort, "Abbrechen" ;Abort + TCODE tResetSettings, "Alles zurücksetzen" ;Reset all + TCODE tResetDeco, "Deko zurücksetzen" ;Reset Deco + TCODE tResetBattery, "neue Batterie" ;Reset Battery + TCODE tResetLogbook, "Logbuch löschen" ;Reset Logbook ; Set Time Menu/Set Date Menu - TCODE tSetHours, "Stunden einst." ; Set Hours - TCODE tSetMinutes,"Minuten einst." ; Set Minutes - TCODE tSetSeconds,"Sekunden zurücks." ; Clear seconds - TCODE tSetDay, "Setze Tag" ; Set Day - TCODE tSetMonth, "Setze Monat" ; Set Month - TCODE tSetYear, "Setze Jahr" ; Set Year + TCODE tSetHours, "Stunden einst." ; Set Hours + TCODE tSetMinutes, "Minuten einst." ; Set Minutes + TCODE tSetSeconds, "Sekunden zurücks." ; Clear seconds + TCODE tSetDay, "Setze Tag" ; Set Day + TCODE tSetMonth, "Setze Monat" ; Set Month + TCODE tSetYear, "Setze Jahr" ; Set Year ; Logbook Offset Menu - TCODE tLogOffset, "Logbuch-Offset" ; Logbook offset - TCODE tLogOffsetp1, "+1" ; +1 - TCODE tLogOffsetp10, "+10" ; +10 - TCODE tLogOffsetm1, "-1" ; -1 - TCODE tLogOffsetm10, "-10" ; -10 - -; Sampling rate - TCODE tSamplingrate, "Abtastrate:" ; Sampling rate: - TCODE tSampling2s, "2s" ; 2s - TCODE tSampling10s, "10s" ; 10s + TCODE tLogOffset, "Logbuch-Offset" ; Logbook offset + TCODE tLogOffsetp1, "+1" ; +1 + TCODE tLogOffsetp10, "+10" ; +10 + TCODE tLogOffsetm1, "-1" ; -1 + TCODE tLogOffsetm10, "-10" ; -10 ; Compass directions - TCODE tN, "N " ; N(orth),338°-22° - TCODE tNE, "NO" ; North-East,23°-67° - TCODE tE, "O " ; E(east),68°-112° - TCODE tSE, "SO" ; South-East,113°-157° - TCODE tS, "S " ; S(outh),157°-202° - TCODE tSW, "SW" ; South-West,203°-247° - TCODE tW, "W " ; W(West),248°-292° - TCODE tNW, "NW" ; North-West,293°-337° + TCODE tN, "N " ; N(orth),338°-22° + TCODE tNE, "NO" ; North-East,23°-67° + TCODE tE, "O " ; E(east),68°-112° + TCODE tSE, "SO" ; South-East,113°-157° + TCODE tS, "S " ; S(outh),157°-202° + TCODE tSW, "SW" ; South-West,203°-247° + TCODE tW, "W " ; W(West),248°-292° + TCODE tNW, "NW" ; North-West,293°-337° ; Color Scheme menu - TCODE tColorScheme, "Farbschema" ; Colour Scheme - TCODE tColorSetDive, "Tauchmodus:" ; Divemode: - TCODE tColorSetName0, "Standard" ; Standard - TCODE tColorSetName1, "Rot" ; Red - TCODE tColorSetName2, "Grün" ; Green - TCODE tColorSetName3, "Blau" ; Blue + TCODE tColorScheme, "Farbschema" ; Colour Scheme + TCODE tColorSetDive, "Tauchmodus:" ; Divemode: + TCODE tColorSetName0, "Standard" ; Standard + TCODE tColorSetName1, "Rot" ; Red + TCODE tColorSetName2, "Grün" ; Green + TCODE tColorSetName3, "Blau" ; Blue - ; PSCR Menu and Settings - TCODE tPSCRMenu, "PSCR Menü" ; PSCR Menu - TCODE tPSCR_O2_drop, "O2 drop:" ; O2 drop - TCODE tPSCR_lungratio,"Lung ratio:" ; lung ratio +; PSCR Menu and Settings + TCODE tPSCRMenu, "pSCR Menü" ; PSCR Menu + TCODE tPSCR_O2_drop, "O2 Abfall :" ; O2 drop + TCODE tPSCR_lungratio, "Lungenverhält.:" ; lung ratio
--- a/src/text_italian.inc Wed Dec 27 14:34:11 2017 +0100 +++ b/src/text_italian.inc Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File text_italian.asm +; File text_italian.asm REFACTORED VERSION V2.95 ; ; Italian texts translation file. ; @@ -10,6 +10,7 @@ ; Basic texts TCODE tNo, "No" ; No TCODE tYes, "Si" ; Yes = No + 1 + TCODE tblank, " " ; (a single space character) ## NEW (layout) ; Surface-mode texts TCODE tBeta, "beta" ; beta @@ -23,7 +24,7 @@ TCODE tDivemenu_Gaslist, "Lista Gas" ; Gaslist TCODE tDivemenu_ResetAvg, "Azzera Media" ; Reset Avg. TCODE tDivemenu_Setpoint, "Setpoint" ; Setpoint - TCODE tDivemenu_UseSensor,"Usa Sensori" ; Use Sensor + TCODE tDivemenu_UseSensor,"usa Sensori" ; Use Sensor TCODE tDivemenu_ToggleGF, "Alterna GF" ; Toggle GF TCODE tDivemenu_Marker, "Set Marker" ; Set Marker TCODE tDivemenu_LostGas, "Gas perduto" ; Lost Gas @@ -50,6 +51,7 @@ TCODE tCalibrateMenu, "Calibration" ; Calibration TCODE tCalibrationGas, "Cal. Gas O2:" ; Cal. Gas O2: TCODE tCalibrate, "Calibrate" ; Calibrate + TCODE tBack, "back..." ; ## NEW ; Gas menu TCODE tGaslist, "Lista Gas OC" @@ -78,15 +80,17 @@ TCODE tSetup_mix, "Imposta Miscela" TCODE tCCRMode, "Modo CCR:" ; CCR Mode: TCODE tCCRModeFixedSP, "SP Fissi" ; Fixed SP - TCODE tCCRModeSensor, "Sensori" ; Sensor + TCODE tCCRModeSensor, "Sensori" ; Sensor TCODE tCCRModeAutoSP, "Auto SP" ; Auto SP TCODE tSP, "SP" ; SP (SetPoint) - TCODE tSPPlus, "ppO2+" ; pO2+ + TCODE tSPPlus, "ppO2+" ; pO2+ TCODE tSensorFallback, "Fallback:" ; Fallback: + TCODE tCalculated, "calculated" ; calculated TCODE tppO2, "ppO2:" ; ppO2: - TCODE tppO2O2, "ppO2(O2)" ; ppO2(O2) - TCODE tppO2Dil, "ppO2(Dil)" ; ppO2(Dil) - + TCODE tppO2O2, "ppO2(O2)" ; ppO2(O2) + TCODE tppO2Dil, "ppO2(Dil)" ; ppO2(Dil) + TCODE tppO2Mix, "ppO2(Mix)" ; ppO2(Mix) + ; New battery menu TCODE tNewBattTitle, "Nuova Batteria?" TCODE tNewBattOld, "Mantieni vecchio" @@ -114,16 +118,18 @@ ; Dive Settings TCODE tDvMode, "Modo Dive:" TCODE tDvOC, "OC" - TCODE tDvCC, "CC" + TCODE tDvCCR, "CCR" TCODE tDvGauge, "Gauge" TCODE tDvApnea, "Apnea" - TCODE tDvPSCR, "PSCR" - TCODE tDkMode, "Algorit.:" - TCODE tZHL16, "ZH-L16" - TCODE tZHL16GF, "ZH-L16+GF" + TCODE tDvPSCR, "pSCR" + TCODE tDvCC, "CC" + TCODE tDkMode, "Algorit.:ZH-L16" ; ## MODIFIED (memory) + TCODE tZHL16, " " ; ## MODIFIED (memory) + TCODE tZHL16GF, "+GF" ; ## MODIFIED (memory) TCODE tPPO2Max, "ppO2 Max:" TCODE tPPO2DECO, "ppO2 Deco:" TCODE tPPO2MIN, "ppO2 Min:" + TCODE tPPO2MINCC, "Min Loop:" ; ## NEW ppO2 min cc TCODE tLastDecostop, "Ultima Deco:" TCODE tDecoparameters, "Parametri Deco" TCODE tGF_low, "GF basso:" @@ -138,6 +144,20 @@ TCODE tDiveaGF_active,"aGF!" ; aGF! TCODE tppO2settings,"Menu ppO2" ; ppO2 Settings (max. 18 chars) TCODE tsafetystopmenu,"Usa tappa sicur:" ; Safety Stop: (max. 16 chars) + TCODE tGasUsage, "Gas Usage" ; Gas Usage + TCODE tSetBotUse, "Bottom Gas: " ; Bottom Gas: (space) + TCODE tSetDecoUse, "Deco Gas: " ; Deco Gas: (space) ## MODIFIED (layout) + TCODE tCalcAscGas, "Calc.Gas (B/O):" ; ## NEW bailout gas needs + TCODE tTankSizes, "Tank Sizes" ; ## NEW bailout gas needs + TCODE tLiter, " l" ; ## NEW bailout gas needs + TCODE tTankFillPress, "Tank Press Budget"; ## NEW bailout gas needs + TCODE tGas1, "Gas 1:" ; ## NEW bailout gas needs + TCODE tGas2, "Gas 2:" ; ## NEW bailout gas needs + TCODE tGas3, "Gas 3:" ; ## NEW bailout gas needs + TCODE tGas4, "Gas 4:" ; ## NEW bailout gas needs + TCODE tGas5, "Gas 5:" ; ## NEW bailout gas needs + TCODE tCCmaxFracO2, "Loop %O2 max.:" ; ## NEW CCR max ppO2 limiter + TCODE t2ndDecoPlanMenu,"2nd Deco Plan" ; ## NEW deco engine ; Display Settings TCODE tBright, "Luminosita':" @@ -145,9 +165,10 @@ TCODE tMedium, "Media" TCODE tHigh, "Alta" TCODE tDvSalinity,"Salinita':" ; Salinity + TCODE tShowppO2, "Always show ppO2:" ; Always show ppO2: TCODE tFlip, "Ruotare schermo:" ; Rotate Screen TCODE tMODwarning,"MOD warning:" ; MOD warning - TCODE tShowppO2, "Always show ppO2:" ; Always show ppO2: + TCODE tIBCDwarning, "IBCD Warning :" ; IBCD Warning ## NEW IBCD TCODE tTimeoutDive,"Dive Timeout:" ; Dive Timeout ; VSI display Settings @@ -167,17 +188,21 @@ TCODE tCalY, "Cal Y:" ; Cal Y TCODE tCalZ, "Cal Z:" ; Cal Z - TCODE tUnits, "Unita':" TCODE tMetric, " m/°C" ; Enum menu TCODE tImperial, "ft/°F" TCODE tDefName, "HW OSTC" - TCODE tbar, "bar" ; bar TCODE tButtonleft,"Bottone sinistra:" ; Left button TCODE tButtonright,"Bottone destra:" ; Right button + TCODE tAltMode, "Waiting Time:" ; ## NEW no fly altitude + TCODE tAltModeFly, "Flying" ; ## NEW no fly altitude + TCODE tAltMode1000, "1000m" ; ## NEW no fly altitude + TCODE tAltMode2000, "2000m" ; ## NEW no fly altitude + TCODE tAltMode3000, "3000m" ; ## NEW no fly altitude + ; Units for all menu TCODE tMeters, "m" TCODE tFeets, "ft" @@ -185,7 +210,11 @@ TCODE tMinutes, "'" TCODE tPercent, "%" TCODE tLitersMinute, "l/min" - + TCODE tbar, "bar" ; bar + TCODE tbar10, "0 bar" ; bar ## NEW 2.95 + TCODE tMeterMinute, "m/min" ; meter per minute ## NEW ascent speed + TCODE tmin, "min" ; minutes + ; Date TCODE tDateFormat, "Data:" TCODE tDateformat, "MMGGAA" @@ -201,14 +230,14 @@ TCODE tBtTm_short,"Tempo:" ; Bot. Time: (max. 6 chars) TCODE tMxDep, "Profond. Max:" ; Max Depth: (10 chars) TCODE tIntvl, "Int.Superf. :" ; Interval : (10 chars) + TCODE tDecoSetup, "Calculator Setup" ; ## NEW (layout) TCODE tDeco, "Calcola Deco" ; Calculate Deco TCODE tDivePlan, "Pianificat:" ; Dive Plan: TCODE tNoDeco, "No Deco" ; No Deco TCODE tMore, "Dettagli.." ; More... - TCODE tGasUsage, "Gas Usage" ; Gas Usage - TCODE tSetBotUse, "Bottom Gas: " ; Bottom Gas: (space) - TCODE tSetDecoUse,"Deco Gas: " ; Deco Gas: (space) - + TCODE tSelectSetpoint,"CCR Setpoint: " ; ## NEW deco calculator enhancement + TCODE tuseAGF, "use aGF: " ; ## NEW deco calculator enhancement + TCODE tCalculating, "Calculating..." ; ## NEW deco calculator enhancement ; Information menu TCODE tFirmware, "Firmware: " ; Firmware: (space) @@ -251,11 +280,24 @@ TCODE taGFactors, "Valori aGF" ; aGF Values TCODE tGFInfo, "Info GF" ; GF Info TCODE tCeiling, "Ceiling" ; Ceiling - TCODE tDiveSafetyStop,"Stop" ; Stop (Four chars, right alligned) + TCODE tDiveSafetyStop,"Stop" ; Stop (Four chars, right alligned) TCODE tDiveFallback, "Fallback!" ; Fallback! (max. nine chars) + TCODE tDecoInfo, "Deco Zone" ; Deco info TCODE tSensorCheck, "Sensor Check" ; Sensor Check TCODE tdil, "Dil:" ; Diluent ppO2 Warning - + TCODE tmix, "Mix:" ; Pre-Mix ppO2 Warning + TCODE tSensorDisagree,"Sensors<>" ; Sensors disagree Warning ## NEW voting logic + TCODE tGasNeedsWarn, "Gas Needs" ; ## NEW bailout gas needs + TCODE tGasNeedsBar, "Gas Needs (bar)" ; ## NEW bailout gas needs + TCODE tCNSsurf, "CNS Surf." ; ## NEW CNS at end-of-dive + TCODE tCNSfTTS, "CNS fTTS" ; ## NEW CNS at end-of-dive + TCODE tCNSBO, "CNS B/O" ; ## NEW CNS at end-of-dive + TCODE tCNSnow, "CNS now" ; ## NEW CNS at end-of-dive + TCODE tCNSeod, "CNS final" ; ## NEW CNS at end-of-dive + TCODE tIBCD, "IBCD N2He" ; ## NEW IBCD + TCODE tMicroBubbles, "M.Bubbles" ; ## NEW microbubbles + TCODE tCNS, "CNS: " ; ## V2.95 optics + ; Divemode menu TCODE tDivePreMenu, "Menu?" ; Menu? TCODE tSetHeading, "Direz." ; Bearing (Max. seven chars) @@ -302,11 +344,6 @@ TCODE tLogOffsetm1, "-1" ; -1 TCODE tLogOffsetm10, "-10" ; -10 -; Sampling rate - TCODE tSamplingrate, "Campionamento:" ; Sampling rate: - TCODE tSampling2s, "2s" ; 2s - TCODE tSampling10s, "10s" ; 10s - ; Compass directions TCODE tN, "N " ; N(orth),338°-22° TCODE tNE, "NE" ; North-East,23°-67°
--- a/src/text_multilang.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/text_multilang.asm Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File text_multilang.asm +; File text_multilang.asm Version 2.92 = 2.26 ; ; Implementation text in various selectable languages. ; @@ -20,7 +20,7 @@ global text_1_base text_1_base: IFNDEF french_italian - MESSG "hwOS code in English and German!" + MESSG "hwOS code in English and German!" ;---- PASS 1 : generate description block ------------------------------------ tcode_idx set 0 LANG set 0 @@ -35,7 +35,9 @@ #undefine TCODE ;============================================================================= - global text_2_base + + + global text_2_base text_2_base: ;---- PASS 1 : generate description block ------------------------------------ @@ -51,8 +53,8 @@ #include "text_german.inc" #undefine TCODE - ELSE - MESSG "hwOS code in French and Italian!" + ELSE + MESSG "hwOS code in French and Italian!" ;============================================================================= ;---- PASS 1 : generate description block ------------------------------------ tcode_idx set 0
--- a/src/tft.inc Wed Dec 27 14:34:11 2017 +0100 +++ b/src/tft.inc Wed Jan 31 19:39:37 2018 +0100 @@ -195,4 +195,4 @@ movff rowRegister,win_top call half_pixel_write endm - +
--- a/src/tft_outputs.asm Wed Dec 27 14:34:11 2017 +0100 +++ b/src/tft_outputs.asm Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File tft_outputs.asm +; File tft_outputs.asm REFACTORED VERSION V2.95a1 ; ; Startup subroutines ; @@ -12,6 +12,7 @@ #include "hwos.inc" ; Mandatory header #include "shared_definitions.h" ; Mailbox from/to p2_deco.c #include "tft.inc" +#include "start.inc" #include "wait.inc" #include "strings.inc" #include "convert.inc" @@ -29,6 +30,7 @@ #include "colorschemes.inc" #include "calibrate.inc" + extern aa_wordprocessor ;============================================================================= @@ -39,70 +41,70 @@ global TFT_divemask_color TFT_divemask_color: movlw color_green - btfsc divemode ; in Divemode? + btfsc divemode ; in Divemode? rcall TFT_divemask_color_dive bra TFT_standard_color0 TFT_divemask_color_dive: - movff opt_dive_color_scheme,WREG ; 0-3 + movff opt_dive_color_scheme,WREG ; 0-3 incf WREG dcfsnz WREG - retlw color_scheme_divemode_mask1 ;0 + retlw color_scheme_divemode_mask1 ;0 dcfsnz WREG - retlw color_scheme_divemode_mask2 ;1 + retlw color_scheme_divemode_mask2 ;1 dcfsnz WREG - retlw color_scheme_divemode_mask3 ;2 - retlw color_scheme_divemode_mask4 ;3 + retlw color_scheme_divemode_mask3 ;2 + retlw color_scheme_divemode_mask4 ;3 global TFT_attention_color TFT_attention_color: - movlw color_yellow ; TODO + movlw color_yellow ; TODO bra TFT_standard_color0 TFT_attention_color_dive: - retlw color_yellow ; TODO + retlw color_yellow ; TODO global TFT_warnings_color TFT_warnings_color: - movlw color_red ; TODO + movlw color_red ; TODO bra TFT_standard_color0 TFT_warnings_color_dive: - retlw color_red ; TODO + retlw color_red ; TODO global TFT_disabled_color TFT_disabled_color: - movlw color_grey ; Default to OSTC grey (dark blue) - btfsc divemode ; in Divemode? + movlw color_grey ; Default to OSTC grey (dark blue) + btfsc divemode ; in Divemode? rcall TFT_disabled_color_dive bra TFT_standard_color0 TFT_disabled_color_dive: - movff opt_dive_color_scheme,WREG ; 0-3 + movff opt_dive_color_scheme,WREG ; 0-3 incf WREG dcfsnz WREG - retlw color_scheme_divemode_dis1 ;0 + retlw color_scheme_divemode_dis1 ;0 dcfsnz WREG - retlw color_scheme_divemode_dis2 ;1 + retlw color_scheme_divemode_dis2 ;1 dcfsnz WREG - retlw color_scheme_divemode_dis3 ;2 - retlw color_scheme_divemode_dis4 ;3 + retlw color_scheme_divemode_dis3 ;2 + retlw color_scheme_divemode_dis4 ;3 global TFT_standard_color TFT_standard_color: - setf WREG ; Default white - btfsc divemode ; in Divemode? + setf WREG ; Default white + btfsc divemode ; in Divemode? rcall TFT_standard_color_dive TFT_standard_color0: - goto TFT_set_color ; and return... + goto TFT_set_color ; and return... TFT_standard_color_dive: - movff opt_dive_color_scheme,WREG ; 0-3 + movff opt_dive_color_scheme,WREG ; 0-3 incf WREG dcfsnz WREG - retlw color_scheme_divemode_std1 ;0 + retlw color_scheme_divemode_std1 ;0 dcfsnz WREG - retlw color_scheme_divemode_std2 ;1 + retlw color_scheme_divemode_std2 ;1 dcfsnz WREG - retlw color_scheme_divemode_std3 ;2 - retlw color_scheme_divemode_std4 ;3 + retlw color_scheme_divemode_std3 ;2 + retlw color_scheme_divemode_std4 ;3 TFT_color_code macro color_code_temp movlw color_code_temp @@ -110,273 +112,221 @@ endm global TFT_color_code1 -TFT_color_code1: ; Color-codes the output, if required +TFT_color_code1: ; Color-codes the output, if required dcfsnz WREG bra TFT_color_code_depth ; depth_warn_mbar [mbar], 16Bit dcfsnz WREG - bra TFT_color_code_cns ; color_code_cns_high [%] + bra TFT_color_code_cns ; color-code CNS values (CNS in hi:lo [%]) dcfsnz WREG - bra TFT_color_code_gf ; color_code_gf_warn_high [%] + bra TFT_color_code_gf ; color-code GF value [%] dcfsnz WREG - bra TFT_color_code_ppo2 ; Color-code the OC ppO2 results [cbar], opt_ppO2_max as threshold + bra TFT_color_code_ppo2 ; Color-code ppO2 values (ppO2 in hi:lo [cbar]) by its warning flags dcfsnz WREG - bra TFT_color_code_ceiling ; Show warning if current depth>shown ceiling + bra TFT_color_code_ceiling ; Color-code the ceiling depth dcfsnz WREG - bra TFT_color_code_gaslist ; Color-code current row in Gaslist (%O2 in hi), opt_ppO2_max as threshold + bra TFT_color_code_gaslist ; Color-code current row in Gaslist (%O2 in hi) according to current amb_pressure dcfsnz WREG - bra TFT_color_code_ppo2_hud ; Color-code the hud ppO2 readings [cbar], opt_ppO2_max as threshold + bra TFT_color_code_ppo2_hud ; Color-code ppO2 values (ppO2 in --:lo [cbar]) by its value dcfsnz WREG - bra TFT_color_code_battery ; Color-code the battery display - -TFT_color_code_gaslist: ; %O2 in hi + bra TFT_color_code_battery ; Color-code the battery display + dcfsnz WREG + bra TFT_color_code_stop ; Color-code the stop depth + + +TFT_color_code_gaslist: ; %O2 in hi ; Check very high ppO2 manually SAFE_2BYTE_COPY amb_pressure,xA - movlw d'10' - movwf xB+0 - clrf xB+1 - call div16x16 ; xC=p_amb/10 - movff xC+0,xA+0 - movff xC+1,xA+1 - movff hi,xB+0 - clrf xB+1 - call mult16x16 ; hi * p_amb/10 + movlw d'10' + movwf xB+0 + clrf xB+1 + call div16x16 ; xC=p_amb/10 + movff xC+0,xA+0 + movff xC+1,xA+1 + movff hi,xB+0 + clrf xB+1 + call mult16x16 ; hi * p_amb/10 ; Check if ppO2>6,55bar - tstfsz xC+2 ; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar? - bra TFT_warnings_color ; Yes, warn in warning color + tstfsz xC+2 ; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar? + bra TFT_warnings_color ; Yes, warn in warning color ; Check if ppO2>3,30bar - btfsc xC+1,7 - bra TFT_warnings_color ; Yes, warn in warning color - + btfsc xC+1,7 + bra TFT_warnings_color ; Yes, warn in warning color ; Check for low ppo2 - movff xC+0,sub_a+0 - movff xC+1,sub_a+1 - movff opt_ppO2_min,WREG - mullw d'100' ; opt_ppO2_min*100 - movff PRODL,sub_b+0 - movff PRODH,sub_b+1 - call subU16 - btfsc neg_flag - bra TFT_warnings_color ; too low -> Warning Color! - + movff xC+0,sub_a+0 + movff xC+1,sub_a+1 + movff char_I_ppO2_min,WREG + mullw d'100' ; char_I_ppO2_min*100 + movff PRODL,sub_b+0 + movff PRODH,sub_b+1 + call subU16 + btfsc neg_flag + bra TFT_warnings_color ; too low -> Warning Color! ; Check for high ppo2 - movff gaslist_gas_global,WREG ; Read current gas O2 ratio - lfsr FSR1,opt_gas_type ; 0=Disabled, 1=First, 2=Travel, 3=Deco for OC gases and 0=Disabled, 1=First, 2=Normal for diluents - movff PLUSW1,xA+0 ; xA+0 used as temp here -> holds type - - movff opt_ppO2_max_deco,xB+1 ; xB+1 used as temp here + movff gaslist_gas_global,WREG ; Read current gas O2 ratio + lfsr FSR1,opt_gas_type ; 0=Disabled, 1=First, 2=Travel, 3=Deco for OC gases and 0=Disabled, 1=First, 2=Normal for diluents + movff PLUSW1,xA+0 ; xA+0 used as temp here -> holds type + movff char_I_ppO2_max_deco,xB+1 ; xB+1 used as temp here movlw .3 - cpfseq xA+0 ; Deco? - movff opt_ppO2_max,xB+1 ; No, overwrite with travel/bottom max - movf xB+1,W ; Result in WREG - mullw d'100' ; opt_ppO2_max*100 + cpfseq xA+0 ; Deco? + movff char_I_ppO2_max,xB+1 ; No, overwrite with travel/bottom max + movf xB+1,W ; Result in WREG + mullw d'100' ; char_I_ppO2_max*100 movff PRODL,sub_b+0 movff PRODH,sub_b+1 infsnz sub_a+0,F - incf sub_a+1,F ; add 1mbar to avoid warning on equal - call subU16 ; sub_c = sub_a - sub_b + incf sub_a+1,F ; add 1mbar to avoid warning on equal + call subU16 ; sub_c = sub_a - sub_b btfss neg_flag - bra TFT_warnings_color ; too high -> Warning Color! + bra TFT_warnings_color ; too high -> Warning Color! return - + + TFT_color_code_ceiling: - SAFE_2BYTE_COPY rel_pressure, lo - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - movff hi,xA+1 - movff lo,xA+0 - movff char_O_first_deco_depth,lo ; Ceiling in m - decf lo,F ; -1 - movlw LOW d'100' - movwf xB+0 - clrf xB+1 ; Devide/100 -> xC+0 = Depth in m - call div16x16 ; xA/xB=xC with xA as remainder - movf xC+0,W ; Depth in m - subwf lo,W - btfsc STATUS,C - bra TFT_warnings_color ; Set to warning color - bra TFT_standard_color ; and return... - -TFT_color_code_depth: - movff hi,hi_temp - movff lo,lo_temp - SAFE_2BYTE_COPY rel_pressure, lo - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - movff lo,sub_a+0 - movff hi,sub_a+1 - movlw LOW depth_warn_mbar - movwf lo - movlw HIGH depth_warn_mbar - movwf hi - movff lo,sub_b+0 - movff hi,sub_b+1 - movff hi_temp,hi - movff lo_temp,lo ; Restore hi, lo - - TSTOSS opt_modwarning ; 0=standard, 1=blink - bra TFT_color_code_depth_std -;TFT_color_code_depth_blink: - call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag - bra TFT_color_code_depth_warn ; Set to warning color - bra TFT_color_code_ppo2_depth ; check depth against MOD ; and return... - - -TFT_color_code_depth_std: - call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag - bra TFT_warnings_color ; Set to warning color - bra TFT_standard_color ; and return... - - -TFT_color_code_ppo2_depth: - movff opt_dive_mode,WREG ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR - decfsz WREG,F - bra TFT_color_code_ppo2_depth_no_ccr ; Not CCR... - - btfsc is_bailout - bra TFT_color_code_ppo2_depth_no_ccr ; Is bailout -> Test for MOD warning - - movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP - decfsz WREG,F - bra TFT_color_code_ppo2_depth_no_ccr ; Not Sensor - ; -> CCR and Sensor: Skip this test - return -TFT_color_code_ppo2_depth_no_ccr: - SAFE_2BYTE_COPY amb_pressure, xA - movlw d'10' + btfsc hi,char_invalid_flag ; is the invalid flag set? (bit 7 here) + bra TFT_color_code_ceiling_1 ; YES + SAFE_2BYTE_COPY rel_pressure,sub_a ; NO + movff lo,sub_b+0 + movff hi,sub_b+1 + call subU16 ; sub_c = sub_a - sub_b : sub_c = rel_pressure [cm] - int_O_ceiling [mbar => cm] + btfsc neg_flag ; is ceiling > current depth? + bra TFT_warnings_color ; YES - set to warning color and return + bra TFT_standard_color ; NO - set to standard color and return +TFT_color_code_ceiling_1: + bcf hi,char_invalid_flag ; clear the invalid flag (bit 7 here) + bra TFT_disabled_color ; set to disabled color and return + + +TFT_color_code_stop: + movff char_O_deco_gas+0,WREG ; get flag for invalid deco data + btfsc WREG,char_invalid_flag ; is the invalid flag set? + bra TFT_disabled_color ; set to disabled color and return + SAFE_2BYTE_COPY rel_pressure,xA ; get current pressure in mbar = cm + movlw LOW d'100' movwf xB+0 clrf xB+1 - call div16x16 ; xC=p_amb/10 - - movff xC+0,xA+0 - movff xC+1,xA+1 - movff char_I_O2_ratio,xB+0 ; =O2 ratio - clrf xB+1 - call mult16x16 ; char_I_O2_ratio * p_amb/10 - -; Check if ppO2>6,55bar - tstfsz xC+2 ; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar? - ;bra TFT_color_code_warn ; Yes, warn in warning color - bra TFT_color_code_depth_warn -; Check if ppO2>3,30bar - btfsc xC+1,7 - bra TFT_color_code_depth_warn - - movff xC+0,sub_a+0 - movff xC+1,sub_a+1 - ;active_gas_type -> 0=Disabled, 1=First, 2=Travel, 3=Deco for OC gases and 0=Disabled, 1=First, 2=Normal for diluents - movff active_gas_type,xA+0 ; xA+0 used as temp here -> holds type - movff opt_ppO2_max_deco,xB+1 ; xB+1 used as temp here - movlw .3 - cpfseq xA+0 ; Deco? - movff opt_ppO2_max,xB+1 ; No, overwrite with travel/bottom max - movf xB+1,W ; Result in WREG - mullw d'100' - movff PRODL,sub_b+0 - movff PRODH,sub_b+1 - infsnz sub_a+0,F - incf sub_a+1,F ; add 1mbar to avoid warning on equal - call subU16 ; sub_c = sub_a - sub_b + call div16x16 ; xA/xB=xC with xA as remainder: Divide/100 => xC+0 = current depth in meters + movff char_O_first_deco_depth,WREG; get stop depth in m into WREG + subwf xC+0,W ; compute current depth - stop depth + btfsc STATUS,C ; result negative? + bra TFT_standard_color ; NO - set to standard color and return + bra TFT_warnings_color ; YES - set to warning color and return + + + +TFT_color_code_depth: ; with depth as rel_pressure in [mbar] in hi:lo + movff lo,sub_a+0 + movff hi,sub_a+1 + movlw LOW depth_warn_mbar + movwf sub_b+0 + movlw HIGH depth_warn_mbar + movwf sub_b+1 + call subU16 ; sub_c = sub_a - sub_b + TSTOSS opt_modwarning ; 0=standard, 1=blink + bra TFT_color_code_depth_std + btfss neg_flag + bra TFT_color_code_depth_warn ; set to warning color + bra TFT_color_code_depth_ppO2 ; check depth against MOD and return... +TFT_color_code_depth_std: btfss neg_flag - bra TFT_color_code_depth_warn - - movff xC+0,sub_a+0 - movff xC+1,sub_a+1 - movff opt_ppO2_min,WREG ; PPO2 min for Sensors and color coding in divemode - mullw d'100' - movff PRODL,sub_b+0 - movff PRODH,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b - btfsc neg_flag - bra TFT_color_code_depth_warn - if dm_offset != 0 - call TFT_standard_color - else - movlw color_green - call TFT_set_color - endif - bcf blinking_depth_warning ; reset warning - return - + bra TFT_warnings_color ; set to warning color and return + bra TFT_standard_color ; set to standard color and return... +TFT_color_code_depth_ppO2: + movff opt_dive_mode,WREG ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR + decfsz WREG,F ; are we in CCR mode? + bra TFT_color_code_depth_no_ccr ; NO - continue checking for ppO2 + btfsc is_bailout ; YES - check if in bailout + bra TFT_color_code_depth_no_ccr ; YES - continue checking for ppO2 +; no warning by depth for all CCR modes when not in bailout ## V2.94 + ;movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP + ;decfsz WREG,F + ;bra TFT_color_code_ppo2_depth_no_ccr ; Not Sensor + bcf blinking_depth_warning ; reset warning + bra TFT_standard_color ; no color coding, return. +TFT_color_code_depth_no_ccr: + movff int_O_breathed_ppO2+1,WREG ; get upper byte of currently breathed ppO2 + btfsc WREG,int_warning_flag ; is the warning flag set? + bra TFT_color_code_depth_warn ; YES - animate in warning design + bcf blinking_depth_warning ; NO - reset warning + bra TFT_standard_color ; set standard color and return TFT_color_code_depth_warn: - bsf blinking_depth_warning ; Set warning - bra TFT_warnings_color ; Set to warning color - -TFT_color_code_cns: - movff int_O_CNS_fraction+1,lo ; copy into bank1 - tstfsz lo ; >255% ? - bra TFT_warnings_color ; Yes - movff int_O_CNS_fraction+0,lo - movlw color_code_cns_high ; CNS Warn [%] - subwf lo,W - btfsc STATUS,C - bra TFT_warnings_color ; Set to warning color - bra TFT_standard_color ; and return... + bsf blinking_depth_warning ; set warning + bra TFT_warnings_color ; set to warning color and return... + + +TFT_color_code_cns: ; with CNS% in hi:lo + btfss hi,int_invalid_flag ; is the invalid flag set? + bra TFT_color_code_cns_1 ; NO + bcf hi,int_invalid_flag ; YES - clear invalid flag ## Todo: use ~bitmask and AND + bcf hi,int_warning_flag ; clear warning flag (it may be set) + bcf hi,int_prewarning_flag ; clear pre-warning flag (it may be set) + bra TFT_disabled_color ; set to disabled color and return +TFT_color_code_cns_1 + btfss hi,int_warning_flag ; is the warning flag set? + bra TFT_color_code_cns_2 ; NO + bcf hi,int_warning_flag ; YES - clear warning ## Todo: use ~bitmask and AND + bcf hi,int_prewarning_flag ; clear pre-warning flag (it may be set) + bra TFT_warnings_color ; set to warning color and return +TFT_color_code_cns_2: + bcf hi,int_prewarning_flag ; clear pre-warning flag (it may be set) + bra TFT_standard_color ; set to standard color and return + TFT_color_code_gf: - movff char_O_gradient_factor,lo ; gradient factor - movlw color_code_gf_warn_high ; GF Warn [%] - subwf lo,W - btfsc STATUS,C - bra TFT_warnings_color ; Set to warning color - bra TFT_standard_color ; and return... + btfsc hi,int_warning_flag ; is the warning flag set? + bra TFT_warnings_color ; YES - set to warning color and return + btfsc hi,int_prewarning_flag ; is the attention flag set? + bra TFT_attention_color ; YES - set to attention color and return + bra TFT_standard_color ; NO - set to normal color and return + TFT_color_code_ppo2: -; Check if ppO2>6,55bar - tstfsz xC+2 ; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar? - bra TFT_warnings_color ; Yes, warn in warning color -; Check if ppO2>3,30bar - btfsc xC+1,7 - bra TFT_warnings_color ; Yes, warn in warning color - - movff xC+0,sub_a+0 - movff xC+1,sub_a+1 - - ;active_gas_type -> 0=Disabled, 1=First, 2=Travel, 3=Deco for OC gases and 0=Disabled, 1=First, 2=Normal for diluents - movff active_gas_type,xA+0 ; xA+0 used as temp here -> holds type - movff opt_ppO2_max_deco,xB+1 ; xB+1 used as temp here - movlw .3 - cpfseq xA+0 ; Deco? - movff opt_ppO2_max,xB+1 ; No, overwrite with travel/bottom max - movf xB+1,W ; Result in WREG - - mullw d'100' - movff PRODL,sub_b+0 - movff PRODH,sub_b+1 - infsnz sub_a+0,F - incf sub_a+1,F ; add 1mbar to avoid warning on equal - call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag - bra TFT_warnings_color ; Set to warning color - - movff xC+0,sub_a+0 - movff xC+1,sub_a+1 - movff opt_ppO2_min,WREG ; PPO2 min for Sensors and color coding in divemode - mullw d'100' - movff PRODL,sub_b+0 - movff PRODH,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b - btfsc neg_flag - bra TFT_warnings_color ; Set to warning color - bra TFT_standard_color ; and return... - -TFT_color_code_ppo2_hud: ; With ppO2 [cbar] in lo - movff opt_ppO2_max,WREG ; PPO2 Max for MOD calculation and color coding in divemode - cpfsgt lo ; lo > opt_ppO2_max? - bra TFT_color_code_ppo2_hud1; No - bra TFT_warnings_color ; Yes + btfss hi,int_warning_flag ; is the warning flag set? + bra TFT_color_code_ppo2_1 ; NO + bcf hi,int_warning_flag ; YES - clear warning flag ## Todo: use ~bitmask and AND + bcf hi,int_prewarning_flag ; clear pre-warning flag (it may be set) + bcf hi,int_high_flag ; clear high warning flag (it may be set) + bcf hi,int_low_flag ; clear low warning flag (it may be set) + bra TFT_warnings_color ; warn in warning color +TFT_color_code_ppo2_1: + bcf hi,int_prewarning_flag ; clear pre-warning flag (it may be set) ## Todo: use ~bitmask and AND + bcf hi,int_high_flag ; clear high warning flag (it may be set) + bcf hi,int_low_flag ; clear low warning flag (it may be set) + bra TFT_standard_color ; set to standard color and return + + +TFT_color_code_ppo2_hud: ; With ppO2 [cbar] in --:lo + movff char_O_deco_warnings,WREG ; get the deco warnings vector + btfss WREG,deco_flag ; are we in deco? + bra TFT_color_code_ppo2_hud_a ; NO - load normal max value as threshold + movff char_I_ppO2_max_deco,WREG ; YES - load deco value as threshold + bra TFT_color_code_ppo2_hud_b +TFT_color_code_ppo2_hud_a: + movff char_I_ppO2_max,WREG ; ppO2 max while not in deco +TFT_color_code_ppo2_hud_b: + cpfsgt lo ; lo > threshold? + bra TFT_color_code_ppo2_hud1 ; NO - continue with checking for ppO2 low + bra TFT_warnings_color ; YES - set warning color and return TFT_color_code_ppo2_hud1: - movff opt_ppO2_min,WREG ; PPO2 min for Sensors and color coding in divemode - cpfslt lo ; lo < opt_ppO2_min? - bra TFT_color_code_ppo2_hud2; No - bra TFT_warnings_color ; Yes -TFT_color_code_ppo2_hud2: - bra TFT_standard_color ; and return... - -TFT_color_code_battery: ; With battery percent in lo - movlw color_code_battery_low - cpfsgt lo ; lo < color_code_battery_low ? - bra TFT_warnings_color ; No - bra TFT_standard_color ; and return... + movff opt_dive_mode,WREG ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR + decfsz WREG,F ; now: 0=CC, 1=Gauge, 2=Apnea, 3=PSCR + bra TFT_color_code_ppo2_hud_nocc; not CCR... + btfsc is_bailout + bra TFT_color_code_ppo2_hud_nocc; is bailout, hence not loop mode... + movff char_I_ppO2_min_loop,WREG ; ppO2 min loop mode color coding + bra TFT_color_code_ppo2_hud_cont +TFT_color_code_ppo2_hud_nocc: + movff char_I_ppO2_min,WREG ; PPO2 min for all other modes +TFT_color_code_ppo2_hud_cont: + cpfslt lo ; lo < char_I_ppO2_min? + bra TFT_standard_color ; NO - set standard color and return... + bra TFT_warnings_color ; Yes - set warning color and return + + +TFT_color_code_battery: ; With battery percent in lo + movlw color_code_battery_low ; get warning threshold + cpfsgt lo ; is battery percent < threshold? + bra TFT_warnings_color ; YES - set to warning color and return + bra TFT_standard_color ; NO - set to standard color and return ; **************************************************************************** @@ -385,7 +335,8 @@ ; Show first gas WIN_SMALL surf_decotype_column+.1,surf_decotype_row+.30 extern get_first_gas_to_WREG,gaslist_strcat_gas - call get_first_gas_to_WREG ; Gets first gas (0-4) into WREG + call get_first_gas_to_WREG ; Gets first gas (1-5) into WREG + decf WREG,W ; 1-5 -> 0-4 movwf PRODL call gaslist_strcat_gas ; Input: PRODL : gas number (0..4), Output: Text appended into buffer pointed by FSR2. STRCAT_PRINT "" @@ -402,7 +353,7 @@ WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left1, surf_decotype_boxes_left1+.8 ;top, bottom, left, right DISP_active_gas_surfmode3: rcall TFT_disabled_color - movff opt_gas_type+1,hi ; 0=Disabled, 1=First, 2=Travel, 3=Deco + movff opt_gas_type+1,hi ; 0=Disabled, 1=First, 2=Travel, 3=Deco tstfsz hi rcall TFT_standard_color WIN_LEFT surf_decotype_boxes_left2+.1 @@ -412,40 +363,41 @@ WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left2, surf_decotype_boxes_left2+.8 ;top, bottom, left, right DISP_active_gas_surfmode4: rcall TFT_disabled_color - movff opt_gas_type+2,hi ; 0=Disabled, 1=First, 2=Travel, 3=Deco + movff opt_gas_type+2,hi ; 0=Disabled, 1=First, 2=Travel, 3=Deco tstfsz hi rcall TFT_standard_color WIN_LEFT surf_decotype_boxes_left3+.1 STRCPY_PRINT "3" decfsz hi,F ; Type = 1 (First)? - bra DISP_active_gas_surfmode5 ; No, skip box + bra DISP_active_gas_surfmode5 ; No, skip box WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left3, surf_decotype_boxes_left3+.8 ;top, bottom, left, right DISP_active_gas_surfmode5: rcall TFT_disabled_color - movff opt_gas_type+3,hi ; 0=Disabled, 1=First, 2=Travel, 3=Deco + movff opt_gas_type+3,hi ; 0=Disabled, 1=First, 2=Travel, 3=Deco tstfsz hi rcall TFT_standard_color WIN_LEFT surf_decotype_boxes_left4+.1 STRCPY_PRINT "4" decfsz hi,F ; Type = 1 (First)? - bra DISP_active_gas_surfmode6 ; No, skip box + bra DISP_active_gas_surfmode6 ; No, skip box WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left4, surf_decotype_boxes_left4+.8 ;top, bottom, left, right DISP_active_gas_surfmode6: rcall TFT_disabled_color - movff opt_gas_type+4,hi ; 0=Disabled, 1=First, 2=Travel, 3=Deco + movff opt_gas_type+4,hi ; 0=Disabled, 1=First, 2=Travel, 3=Deco tstfsz hi rcall TFT_standard_color WIN_LEFT surf_decotype_boxes_left5+.1 STRCPY_PRINT "5" - rcall TFT_standard_color ; Reset color + rcall TFT_standard_color ; Reset color decfsz hi,F ; Type = 1 (First)? - return ; no, Done. + return ; no, Done. WIN_FRAME_STD surf_decotype_boxes_top, surf_decotype_boxes_bottom, surf_decotype_boxes_left5, surf_decotype_boxes_left5+.8 ;top, bottom, left, right - return ; Done. - + return ; Done. + + global TFT_show_color_schemes -TFT_show_color_schemes: ; update the color schemes - bsf divemode ; put in divemode +TFT_show_color_schemes: ; update the color schemes + bsf divemode ; put in divemode call TFT_divemask_color WIN_TINY .12,.40 STRCAT_TEXT_PRINT tDepth @@ -465,9 +417,9 @@ movwf hi bsf leftbind bsf ignore_digit4 - output_16 ; Full meters in Big font + output_16 ; Full meters in Big font bcf leftbind - STRCAT_PRINT "" ; Display full meters + STRCAT_PRINT "" ; Display full meters WIN_SMALL .25,.66 movlw LOW .5172 movwf lo @@ -477,20 +429,20 @@ movlw d'4' movwf ignore_digits bsf ignore_digit5 - output_16dp d'0' ; .1m in SMALL font - STRCAT_PRINT "" ; Display decimeters + output_16dp d'0' ; .1m in SMALL font + STRCAT_PRINT "" ; Display decimeters WIN_FONT FT_SMALL ; Max. Depth demo WIN_MEDIUM .64,.54 - bsf ignore_digit4 ; no 0.1m + bsf ignore_digit4 ; no 0.1m bsf leftbind movlw LOW .6349 movwf lo movlw HIGH .6349 movwf hi output_16 - STRCAT_PRINT "" ; Display full meters + STRCAT_PRINT "" ; Display full meters bcf leftbind ; .1m in SMALL font WIN_SMALL .87,.66 @@ -504,99 +456,90 @@ movlw HIGH .6349 movwf hi output_16dp d'0' - STRCAT_PRINT "" ; Display decimeters + STRCAT_PRINT "" ; Display decimeters bcf leftbind ; Divetime demo movff mins,lo clrf hi WIN_MEDIUM .103, .54 - output_16_3 ; limit to 999 and display only (0-999) - STRCAT_PRINT "" ; Show minutes in large font - WIN_SMALL .139, .66 ; left position for two sec figures + output_16_3 ; limit to 999 and display only (0-999) + STRCAT_PRINT "" ; Show minutes in large font + WIN_SMALL .139, .66 ; left position for two sec figures PUTC ':' bsf leftbind movff secs,lo output_99x bcf leftbind - STRCAT_PRINT "" ; Show seconds in small font - - bcf divemode ; don't stay in divemode + STRCAT_PRINT "" ; Show seconds in small font + + bcf divemode ; don't stay in divemode return global TFT_divemode_mask -TFT_divemode_mask: ; Displays mask in Dive-Mode - if dm_offset != 0 - call TFT_divemask_color - WIN_TINY dm_mask_depth_column,dm_mask_depth_row - STRCAT_TEXT_PRINT tDepth - WIN_TINY dm_mask_maxdepth_column,dm_mask_maxdepth_row - TSTOSS opt_vsigraph ; 0=skip, 1=draw - WIN_TINY dm_mask_maxdepth_column_nvsi,dm_mask_maxdepth_row - STRCAT_TEXT_PRINT tMaxDepth - WIN_TINY dm_mask_divetime_column,dm_mask_divetime_row - STRCAT_TEXT_PRINT tDivetime - endif - - if dm_offset == 0 - movlw color_dark_red - call TFT_set_color - TSTOSS opt_vsigraph ; 0=skip, 1=draw - bra $+4 - WIN_FRAME_COLOR16 dm_velobar_top, dm_velobar_bot, dm_velobar_lft, dm_velobar_rgt ;top, bottom, left, right - WIN_FRAME_COLOR16 dm_sep_1_2_row, dm_sep_1_2_row, .0, .159 ;top, bottom, left, right - WIN_FRAME_COLOR16 dm_sep_2_3_row, dm_sep_2_3_row, .0, .159 ;top, bottom, left, right - WIN_FRAME_COLOR16 dm_warning_row-.1, dm_warning_row-.1, dm_warning_column, .159 ;top, bottom, left, right - TSTOSS opt_vsigraph ; 0=skip, 1=draw - bra $+4 - WIN_FRAME_COLOR16 dm_warning_row-.1, dm_warning_row-.1, dm_max_depth_column_nvsi, .159 ;top, bottom, left, right - call TFT_draw_gassep_line - endif - - bra TFT_standard_color ; and return... - +TFT_divemode_mask: ; Displays mask in divemode + bcf FLAG_TFT_divemode_mask + call TFT_divemask_color + WIN_TINY dm_mask_depth_column,dm_mask_depth_row + STRCAT_TEXT_PRINT tDepth + WIN_TINY dm_mask_maxdepth_column,dm_mask_maxdepth_row + TSTOSS opt_vsigraph ; 0=skip, 1=draw + WIN_TINY dm_mask_maxdepth_column_nvsi,dm_mask_maxdepth_row + STRCAT_TEXT_PRINT tMaxDepth + WIN_TINY dm_mask_divetime_column,dm_mask_divetime_row + STRCAT_TEXT_PRINT tDivetime + bra TFT_standard_color ; and return... + + global TFT_divemode_mask_alternative +TFT_divemode_mask_alternative: ; Alt. mask for divemode + bcf FLAG_TFT_divemode_mask_alt + call TFT_divemask_color + WIN_TINY dm_mask_depth_column,dm_mask_depth_row + STRCAT_TEXT_PRINT tDepth + WIN_TINY dm_mask_divetime_column-.30,dm_mask_divetime_row + STRCAT_TEXT_PRINT tDivetime + bra TFT_standard_color ; and return... + global TFT_draw_gassep_line TFT_draw_gassep_line: btfsc FLAG_apnoe_mode ; Ignore in Apnoe mode return btfsc divemode_menu ; Is the dive mode menu shown? return ; Yes, return - if dm_offset == 0 - movlw color_dark_red - call TFT_set_color - WIN_FRAME_COLOR16 dm_gassep_row, dm_gassep_bot, dm_gassep_column, dm_gassep_column - endif - bra TFT_standard_color ; and return... + bra TFT_standard_color ; and return... ;========================================================================= global TFT_display_velocity TFT_display_velocity: ; With divA+0 = m/min, neg_flag_velocity: ascend=1, descend=0 - bcf STATUS,C - movlw velocity_display_threshold_1 ; lowest threshold for display vertical velocity - subwf divA+0,W - btfss STATUS,C - bra TFT_velocity_clear ; lower then threshold. Clear text and graph (If active) + bcf STATUS,C + movlw velocity_display_threshold_1 ; lowest threshold for display vertical velocity + subwf divA+0,W + btfss STATUS,C + bra TFT_velocity_clear ; lower then threshold. Clear text and graph (If active) ; We have something to display - bsf display_velocity ; Set flag + bsf display_velocity ; Set flag ; check if descending: no warning color if descending - call TFT_standard_color - btfsc neg_flag_velocity ; Ignore for descent! - rcall TFT_velocity_set_color ; Set color for text and set threshold for graph - - rcall TFT_velocity_disp ; Show the text - - TSTOSS opt_vsigraph ; =1: draw the graphical VSI bar - bra TFT_display_velocity_done ; No graph - - btfsc neg_flag_velocity ; Ignore for descent! - rcall TFT_velocity_graph ; Show the graph - btfss neg_flag_velocity ; Ignore for descent! - rcall TFT_velocity_clear_graph ; Clear the graph for descent + rcall TFT_standard_color + btfsc neg_flag_velocity ; Ignore for descent! + rcall TFT_velocity_set_color ; Set color for text and set threshold for graph + + rcall TFT_velocity_disp ; Show the text + + TSTOSS opt_vsigraph ; =1: draw the graphical VSI bar + bra TFT_display_velocity_done ; No graph + + btfsc alternative_divelayout ; Alternative layout? + bra TFT_display_velocity_done ; Yes, no graph! (no room when divetime minutes is three figures) + + btfsc neg_flag_velocity ; Ignore for descent! + rcall TFT_velocity_graph ; Show the graph + btfss neg_flag_velocity ; Ignore for descent! + rcall TFT_velocity_clear_graph ; Clear the graph for descent TFT_display_velocity_done: - bra TFT_standard_color ; and return! + bra TFT_standard_color ; and return! TFT_speed_table: ; use a depth-dependent ascent rate warning @@ -619,21 +562,21 @@ DB .50,.19,.15,.0 DB .200,.20,.15,.0 -TFT_velocity_set_color: ; Set color based on speed table or use static thresholds, with divA+0 = m/min +TFT_velocity_set_color: ; Set color based on speed table or use static thresholds, with divA+0 = m/min ; check if old/new ascend logic is used TSTOSS opt_vsitextv2 ; 0=standard, 1=dynamic bra TFT_velocity_set_color_static ; static ascend rate limit ; get the actual depth in m SAFE_2BYTE_COPY rel_pressure, lo - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] movff hi,xA+1 movff lo,xA+0 movlw LOW d'100' movwf xB+0 - clrf xB+1 ; Devide/100 -> xC+0 = Depth in m - call div16x16 ; xA/xB=xC with xA as remainder - ;movf xC+0,W ; Depth in m + clrf xB+1 ; Devide/100 -> xC+0 = Depth in m + call div16x16 ; xA/xB=xC with xA as remainder + ;movf xC+0,W ; Depth in m ; point to speed table movlw LOW (TFT_speed_table-.3) @@ -644,21 +587,21 @@ movwf TBLPTRU TFT_velocity_set_color_skip: - TBLRD*+ ; 3 dummy reads + TBLRD*+ ; 3 dummy reads TBLRD*+ TBLRD*+ - TBLRD*+ ; Get speed threshold - movf xC+0,W ; Depth in m - cpfsgt TABLAT ; Threshold > current depth ? - bra TFT_velocity_set_color_skip ; No + TBLRD*+ ; Get speed threshold + movf xC+0,W ; Depth in m + cpfsgt TABLAT ; Threshold > current depth ? + bra TFT_velocity_set_color_skip ; No - TBLRD*+ ; Get warning speed threshold + TBLRD*+ ; Get warning speed threshold movf TABLAT,W movwf divA+1 ; Copy for graph routine cpfslt divA+0 ; smaller then actual value (in m/min)? bra TFT_warnings_color ; Set Warning color (And return) - TBLRD*+ ; Get attention speed threshold + TBLRD*+ ; Get attention speed threshold movf TABLAT,W cpfslt divA+0 ; smaller then actual value (in m/min)? bra TFT_attention_color ; Set Attention color (And return) @@ -676,7 +619,7 @@ TFT_velocity_disp: WIN_SMALL dm_velocity_text_column, dm_velocity_text_row - TSTOSS opt_units ; 0=Meters, 1=Feets + TSTOSS opt_units ; 0=Meters, 1=Feets bra TFT_velocity_metric ;TFT_velocity_imperial: movff divA+0,WREG ; divA+0 = m/min @@ -692,7 +635,7 @@ output_16 bcf leftbind STRCAT_TEXT_PRINT tVelImperial ; Unit switch - return + return TFT_velocity_metric: movff divA+0,lo ; divA+0 = m/min @@ -702,11 +645,11 @@ movwf POSTINC2 output_99 STRCAT_TEXT_PRINT tVelMetric ; Unit switch - return + return TFT_velocity_graph: ; divA+0 = m/min ; divA+0 holding the ascend speed in m/min - movff divA+0,hi ; Copy + movff divA+0,hi ; Copy WIN_BOX_BLACK dm_velobar_top, dm_velobar_bot, dm_velobar_lft, dm_velobar_rgt ;top, bottom, left, right -> outer frame rcall TFT_divemask_color_dive ; Color -> WREG WIN_FRAME_COLOR dm_velobar_top, dm_velobar_bot, dm_velobar_lft, dm_velobar_rgt ;inner frame @@ -731,7 +674,7 @@ call div16x16 ;xA/xB=xC with xA as remainder ; xC+0 now holds amount of segments to show - movff hi,divA+0 ; Copy back for numeric output + movff hi,divA+0 ; Copy back for numeric output movlw d'7' cpfslt xC+0 bra DISP_graph_vel_7 @@ -777,7 +720,7 @@ rcall TFT_standard_color_dive ; Color -> WREG WIN_BOX_COLOR dm_velobar_top+.62, dm_velobar_top+.68, dm_velobar_lft+.2, dm_velobar_rgt-.2 ;top, bottom, left, right DISP_graph_vel_0: - return ; Done. + return ; Done. global TFT_velocity_clear TFT_velocity_clear: @@ -801,88 +744,207 @@ WIN_BOX_BLACK dm_decostop_1st_stop_row, .239, dm_decostop_1st_stop_column, .159 ; top, bottom, left, right return + global TFT_clear_divemode_menu TFT_clear_divemode_menu: - if dm_offset != 0 - WIN_BOX_BLACK dm_menu_row, dm_menu_lower, dm_menu_left, dm_menu_right ; top, bottom, left, right - else - WIN_BOX_BLACK dm_3rdrow_top, dm_3rdrow_bot, dm_3rdrow_lft, dm_3rdrow_rgt ; top, bottom, left, right - endif + WIN_BOX_BLACK dm_menu_row, dm_menu_lower, dm_menu_left, dm_menu_right ; top, bottom, left, right return + global TFT_display_ndl_mask TFT_display_ndl_mask: + bcf FLAG_TFT_display_ndl_mask btfsc divemode_menu ; Is the dive mode menu shown? return ; Yes, return - rcall TFT_clear_decoarea ; Clear Dekostop and Dekosum - if dm_offset != 0 - call TFT_divemask_color - else - call TFT_attention_color - endif - WIN_STD dm_ndl_text_column, dm_ndl_text_row + call TFT_clear_decoarea ; Clear Dekostop and Dekosum + call TFT_divemask_color + WIN_STD dm_ndl_text_column, dm_ndl_text_row STRCPY_TEXT_PRINT tNDL ; NDL - bra TFT_standard_color ; and return... - - global TFT_show_TTS_divemode -TFT_show_TTS_divemode: + bra TFT_standard_color ; and return... + + + global TFT_display_tts +TFT_display_tts: + bcf FLAG_TFT_display_tts btfsc divemode_menu ; Is the dive mode menu shown? return ; Yes, return call TFT_standard_color movff int_O_ascenttime+0,lo ; TTS movff int_O_ascenttime+1,hi ; on 16bits + btfss hi,int_invalid_flag ; is the invalid flag set? + bra TFT_display_tts_1 ; NO + bcf hi,int_invalid_flag ; YES - clear flag + call TFT_disabled_color ; switch to disabled color +TFT_display_tts_1: WIN_MEDIUM dm_tts_value_column, dm_tts_value_row - output_16_3 ;Displays only 0...999 + output_16_3 ; Displays only 0...999 STRCAT_PRINT "'" return + global TFT_display_ndl TFT_display_ndl: + bcf FLAG_TFT_display_ndl btfsc divemode_menu ; Is the dive mode menu shown? return ; Yes, return - WIN_MEDIUM dm_ndl_value_column, dm_ndl_value_row - call TFT_standard_color - movff char_O_nullzeit,lo ; Get NDL from C-code + WIN_MEDIUM dm_ndl_value_column, dm_ndl_value_row + call TFT_standard_color + movff char_O_nullzeit,lo ; Get NDL from C-code + output_8 + STRCAT_PRINT "'" + return + + + global TFT_big_deco_alt ; The big deco +TFT_big_deco_alt: + bcf FLAG_TFT_big_deco_alt + + btfss decostop_active ; deco? + bra TFT_big_deco_ndl_alt ; NDL + + ; Deco + bcf FLAG_TFT_display_deko + call TFT_divemask_color + WIN_STD .70,.165 + STRCPY_TEXT_PRINT tTTS ; TTS + rcall TFT_standard_color + + ; TTS + WIN_LARGE .97,.170 + movff int_O_ascenttime+0,lo ; TTS + movff int_O_ascenttime+1,hi ; on 16bits + btfss hi,int_invalid_flag ; is the invalid flag set? + bra TFT_display_tts_alt_1 ; NO + bcf hi,int_invalid_flag ; YES - clear flag + call TFT_disabled_color ; switch to disabled color +TFT_display_tts_alt_1: + output_16_3 ; Displays only 0...999 + STRCAT_PRINT "" + + ; 1st Stop + call TFT_divemask_color + WIN_STD .25,dm_customview_row + STRCPY_TEXT_PRINT tDiveSafetyStop ; "Stop" + + WIN_LARGE .60,.95 + TFT_color_code warn_stop ; Color-code Output + movff char_O_first_deco_depth,lo ; stop depth in m + rcall TFT_display_deko_output_depth ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft) + STRCAT_PRINT "" + + ; m or ft after the stop depth + WIN_MEDIUM .100,.118 + TSTOSS opt_units ; 0=m, 1=ft + bra TFT_display_tts_alt_1_metric + STRCAT_TEXT_PRINT tFeets1 + bra TFT_display_tts_alt_1_com +TFT_display_tts_alt_1_metric: + STRCAT_TEXT_PRINT tMeters +TFT_display_tts_alt_1_com: + WIN_LARGE .117,.95 + movff char_O_first_deco_time,lo ; length of first stop in min + bcf leftbind + output_99 + STRCAT_PRINT "" + goto TFT_standard_color ; and return... + +TFT_big_deco_ndl_alt: + ; NDL + bcf FLAG_TFT_display_ndl + bcf decostop_active ; clear flag (again) + call TFT_divemask_color + WIN_STD .70,.165 + STRCPY_TEXT_PRINT tNDL ; NDL + call TFT_standard_color + WIN_LARGE .97,.170 + call TFT_standard_color + movff char_O_nullzeit,lo ; Get NDL from C-code + output_8 + STRCAT_PRINT "" + + btfsc FLAG_TFT_show_safety_stop + bra TFT_show_safety_stop_alt ; Show safety stop (And return) + ; Clear any safety stop or Decostop +TFT_no_more_safety_stop_alt: + WIN_BOX_BLACK dm_customview_row, .150, .0, .159 ; top, bottom, left, right + WIN_BOX_BLACK dm_customview_row, .164, .60, .159 ; top, bottom, left, right + return + +TFT_show_safety_stop_alt: + bcf FLAG_TFT_show_safety_stop + tstfsz safety_stop_countdown ; Countdown at zero? + bra TFT_show_safety_stop_alt2 ; No, show stop + bcf show_safety_stop ; Clear flag + btfss safety_stop_active ; Displayed? + return ; No + bcf safety_stop_active ; Clear flag + bra TFT_no_more_safety_stop_alt ; Yes, Clear stop ; and return... + +TFT_show_safety_stop_alt2: + bsf safety_stop_active ; Set flag + decf safety_stop_countdown,F ; Reduce countdown + + call TFT_divemask_color + WIN_STD .50,dm_customview_row + STRCPY_TEXT_PRINT tDiveSafetyStop + call TFT_attention_color ; show in yellow + WIN_LARGE .90,.95 + movff safety_stop_countdown,lo + clrf hi + call convert_time ; converts hi:lo in seconds to mins (hi) and seconds (lo) + movf hi,W + movff lo,hi + movwf lo ; exchange lo and hi + bsf leftbind output_8 - STRCAT_PRINT "'" - return + STRCAT_PRINT "" + WIN_MEDIUM .112,.120 + STRCAT_PRINT ":" + WIN_LARGE .117,.95 + bcf leftbind + movff hi,lo + output_99x + STRCAT_PRINT "" + WIN_FONT FT_SMALL + goto TFT_standard_color ; and return... + global TFT_divemode_warning TFT_divemode_warning: - bsf dive_warning_displayed ; =1: The warning sign is shown - WIN_TOP dm_warning_icon_row - WIN_LEFT dm_warning_icon_column - TFT_WRITE_PROM_IMAGE dive_warning2_block ; Show Warning icon - return + bcf FLAG_TFT_divemode_warning + bsf dive_warning_displayed ; =1: The warning sign is shown + WIN_TOP dm_warning_icon_row + WIN_LEFT dm_warning_icon_column + TFT_WRITE_PROM_IMAGE dive_warning2_block ; Show Warning icon + return global TFT_divemode_warning_clear TFT_divemode_warning_clear: - btfss dive_warning_displayed ; =1: The warning sign is shown - return - bcf dive_warning_displayed ; clear only once - WIN_BOX_BLACK dm_warning_icon_row, dm_warning_icon_bot, dm_warning_icon_column, dm_warning_icon_rgt ; top, bottom, left, right + bcf FLAG_TFT_divemode_warning_clear + btfss dive_warning_displayed ; =1: The warning sign is shown return + bcf dive_warning_displayed ; clear only once + WIN_BOX_BLACK dm_warning_icon_row, dm_warning_icon_bot, dm_warning_icon_column, dm_warning_icon_rgt ; top, bottom, left, right + return + global TFT_display_deko_mask TFT_display_deko_mask: - btfsc divemode_menu ; Is the dive mode menu shown? - return ; Yes, return - - rcall TFT_clear_decoarea - WIN_STD dm_tts_text_column, dm_tts_text_row - if dm_offset != 0 - call TFT_divemask_color - else - call TFT_attention_color - endif - STRCPY_TEXT_PRINT tTTS ; TTS - call TFT_standard_color - bcf show_safety_stop ; Clear safety stop flag + bcf FLAG_TFT_display_deko_mask + btfsc divemode_menu ; Is the dive mode menu shown? + return ; Yes, return + rcall TFT_clear_decoarea ; Clear Dekostop and Dekosum (and NDL in this case) + WIN_STD dm_tts_text_column, dm_tts_text_row + call TFT_divemask_color + STRCPY_TEXT_PRINT tTTS ; TTS + call TFT_standard_color + bcf show_safety_stop ; Clear safety stop flag return -TFT_display_deko_output_depth: ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft) + +TFT_display_deko_output_depth: ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (for ft) TSTOSS opt_units ; 0=m, 1=ft - bra TFT_display_deko_output_metric + bra TFT_display_deko_output_metric ;TFT_display_deko_output_imperial: movf lo,W ; lo = m mullw .100 ; PRODL:PRODH = mbar @@ -909,29 +971,38 @@ movff xC+0,lo movff xC+1,hi ; restore lo and hi with updated value bcf leftbind + btfsc alternative_divelayout + bsf leftbind ; left for alternative layout mode bsf ignore_digit4 ; Only full feet output_16 + btfsc alternative_divelayout + return ; Not for alternative layout mode STRCAT_TEXT tFeets1 return TFT_display_deko_output_metric: output_99 + btfsc alternative_divelayout + return ; Not for alternative layout mode STRCAT_TEXT tMeters PUTC ' ' return + global TFT_display_deko TFT_display_deko: + bcf FLAG_TFT_display_deko btfsc divemode_menu ; Is the dive mode menu shown? return ; Yes, return - WIN_MEDIUM dm_decostop_1st_stop_column, dm_decostop_1st_stop_row - TFT_color_code warn_ceiling ; Color-code Output - movff char_O_first_deco_depth,lo ; Ceiling in m + WIN_MEDIUM dm_decostop_1st_stop_column, dm_decostop_1st_stop_row + TFT_color_code warn_stop ; Color-code Output + movff char_O_first_deco_depth,lo ; stop depth in m rcall TFT_display_deko_output_depth ; Outputs depth (stored in lo) to POSTINC2 with "m" or w/o (For ft) movff char_O_first_deco_time,lo ; length of first stop in min output_99 STRCAT_PRINT "'" - goto TFT_standard_color ; and return... + goto TFT_standard_color ; and return... + global TFT_decoplan TFT_decoplan: @@ -939,7 +1010,6 @@ WIN_TINY dm_custom_decoplan_title_column, dm_custom_decoplan_title_row STRCPY_TEXT_PRINT tDiveDecoplan call TFT_standard_color - movff char_O_deco_depth+1,lo tstfsz lo ; Show another stop? bra TFT_display_deko2 ; Yes @@ -947,11 +1017,15 @@ call TFT_standard_color WIN_SMALL dm_cust_dstop_4th_stop_column,dm_cust_dstop_4th_stop_row STRCPY_PRINT " --- " - WIN_BOX_BLACK dm_cust_dstop_2nd_stop_row, dm_customview_bot-.1, dm_cust_dstop_2nd_stop_column, dm_cust_dstop_4th_stop_column ; top, bottom, left, right + WIN_BOX_BLACK dm_cust_dstop_2nd_stop_row, dm_customview_bot-.2, dm_cust_dstop_2nd_stop_column, dm_cust_dstop_4th_stop_column ; top, bottom, left, right WIN_BOX_BLACK dm_cust_dstop_5th_stop_row, dm_customview_bot, dm_cust_dstop_5th_stop_column, dm_cust_dstop_6th_stop_column ; top, bottom, left, right WIN_BOX_BLACK dm_cust_dstop_6th_stop_row, dm_customview_bot, dm_cust_dstop_6th_stop_column, .159 ; top, bottom, left, right - return + goto TFT_standard_color ; and return... + TFT_display_deko2: + movff char_O_deco_gas+0,lo ; get flag for invalid deco data + btfsc lo,char_invalid_flag ; is the invalid flag set? + call TFT_disabled_color ; YES - set to disabled color WIN_SMALL dm_cust_dstop_2nd_stop_column, dm_cust_dstop_2nd_stop_row movff char_O_deco_depth+1,lo ; stop in m bcf lo,7 ; Clear GAS_SWITCH bit @@ -963,9 +1037,9 @@ tstfsz lo ; Show another stop? bra TFT_display_deko3 ; Yes ; No, clear output and return - WIN_BOX_BLACK dm_cust_dstop_3rd_stop_row, dm_customview_bot-.1, dm_cust_dstop_2nd_stop_column, dm_cust_dstop_4th_stop_column ; top, bottom, left, right + WIN_BOX_BLACK dm_cust_dstop_3rd_stop_row, dm_customview_bot-.2, dm_cust_dstop_2nd_stop_column, dm_cust_dstop_4th_stop_column ; top, bottom, left, right WIN_BOX_BLACK dm_cust_dstop_4th_stop_row, dm_customview_bot, dm_cust_dstop_4th_stop_column, .159 ; top, bottom, left, right - return + goto TFT_standard_color ; and return... TFT_display_deko3: WIN_SMALL dm_cust_dstop_3rd_stop_column, dm_cust_dstop_3rd_stop_row @@ -975,13 +1049,12 @@ movff char_O_deco_time+2,lo ; length of stop in min output_99 STRCAT_PRINT "'" - movff char_O_deco_depth+3,lo tstfsz lo ; Show another stop? bra TFT_display_deko4 ; Yes ; No, clear output and return WIN_BOX_BLACK dm_cust_dstop_4th_stop_row, dm_customview_bot, dm_cust_dstop_4th_stop_column, .159 ; top, bottom, left, right - return ; Done. + goto TFT_standard_color ; and return... TFT_display_deko4: WIN_SMALL dm_cust_dstop_4th_stop_column, dm_cust_dstop_4th_stop_row @@ -998,7 +1071,7 @@ ; No, clear output and return WIN_BOX_BLACK dm_cust_dstop_5th_stop_row, dm_customview_bot, dm_cust_dstop_5th_stop_column, dm_cust_dstop_6th_stop_column ; top, bottom, left, right WIN_BOX_BLACK dm_cust_dstop_6th_stop_row, dm_customview_bot, dm_cust_dstop_6th_stop_column, .159 ; top, bottom, left, right - return ; Done. + goto TFT_standard_color ; and return... TFT_display_deko5: WIN_SMALL dm_cust_dstop_5th_stop_column, dm_cust_dstop_5th_stop_row @@ -1013,7 +1086,8 @@ bra TFT_display_deko6 ; Yes ; No, clear output and return WIN_BOX_BLACK dm_cust_dstop_6th_stop_row, dm_customview_bot, dm_cust_dstop_6th_stop_column, .159 ; top, bottom, left, right - return ; Done. + goto TFT_standard_color ; and return... + TFT_display_deko6: WIN_SMALL dm_cust_dstop_6th_stop_column, dm_cust_dstop_6th_stop_row movff char_O_deco_depth+5,lo ; stop in m @@ -1027,7 +1101,8 @@ bra TFT_display_deko7 ; Yes ; No, clear output and return WIN_BOX_BLACK dm_cust_dstop_7th_stop_row, dm_customview_bot, dm_cust_dstop_7th_stop_column, .159 ; top, bottom, left, right - return ; Done. + goto TFT_standard_color ; and return... + TFT_display_deko7: WIN_SMALL dm_cust_dstop_7th_stop_column, dm_cust_dstop_7th_stop_row movff char_O_deco_depth+6,lo ; stop in m @@ -1036,55 +1111,40 @@ movff char_O_deco_time+6,lo ; length of stop in min output_99 STRCAT_PRINT "'" - return ; Done. - -;TFT_display_deko1: -; movff char_O_gradient_factor,lo ; gradient factor -; movlw gf_display_threshold ; threshold for display -; cpfslt lo ; show value? -; bra TFT_display_deko2 ; Yes -; ; No -; bra TFT_display_ndl_mask2 ; Clear gradient factor -; + goto TFT_standard_color ; and return... + global TFT_clear_safety_stop TFT_clear_safety_stop: + bcf FLAG_TFT_clear_safety_stop ; clear flag WIN_BOX_BLACK dm_safetystop_row, dm_safetystop_bot, dm_safetystop_text_column, .159 ; top, bottom, left, right return global TFT_show_safety_stop TFT_show_safety_stop: + bcf FLAG_TFT_show_safety_stop tstfsz safety_stop_countdown ; Countdown at zero? bra TFT_show_safety_stop2 ; No, show stop - bcf show_safety_stop ; Clear flag - btfss safety_stop_active ; Displayed? return ; No bcf safety_stop_active ; Clear flag btfsc divemode_menu ; Is the dive mode menu shown? return ; Yes, return bra TFT_clear_safety_stop ; Yes, Clear stop ; and return... - TFT_show_safety_stop2: bsf safety_stop_active ; Set flag decf safety_stop_countdown,F ; Reduce countdown - btfsc divemode_menu ; Is the dive mode menu shown? return ; Yes, return ;btfsc menuview - ;bra TFT_show_safety_stop3 ; No room when menuview=1... - if dm_offset != 0 - call TFT_divemask_color - else - call TFT_standard_color - endif + ;bra TFT_show_safety_stop3 ; No room when menuview=1... + call TFT_divemask_color WIN_STD dm_safetystop_text_column, dm_safetystop_text_row STRCPY_TEXT_PRINT tDiveSafetyStop TFT_show_safety_stop3: - call TFT_attention_color ; show in yellow + call TFT_attention_color ; show in yellow WIN_MEDIUM dm_safetystop_column, dm_safetystop_row - lfsr FSR2,buffer movff safety_stop_countdown,lo clrf hi call convert_time ; converts hi:lo in seconds to mins (hi) and seconds (lo) @@ -1099,9 +1159,10 @@ output_99x STRCAT_PRINT "" WIN_FONT FT_SMALL - goto TFT_standard_color; and return... - - global TFT_mask_avr_stopwatch ; Show mask for average depth and stopwatch + goto TFT_standard_color ; and return... + + + global TFT_mask_avr_stopwatch ; Show mask for average depth and stopwatch TFT_mask_avr_stopwatch: ; The mask call TFT_divemask_color @@ -1111,62 +1172,18 @@ STRCPY_TEXT_PRINT tDiveStopwatch WIN_TINY dm_custom_avr_stop_title_column3,dm_custom_avr_stop_title_row STRCPY_TEXT_PRINT tDiveStopAvg - goto TFT_standard_color ; and return... - - global TFT_dyn_gaslist -TFT_dyn_gaslist: ; Show the dynamic gaslist - ; The mask - call TFT_divemask_color - WIN_TINY dm_custom_dyn_gas_mask_column,dm_custom_dyn_gas_mask_row - STRCPY_TEXT_PRINT tGaslist -; call TFT_standard_color - - WIN_SMALL dm_custom_dyn_gas_column1,dm_custom_dyn_gas_row1 - bsf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint - clrf uart1_temp - rcall TFT_dyn_gaslist_common - WIN_SMALL dm_custom_dyn_gas_column1,dm_custom_dyn_gas_row2 - rcall TFT_dyn_gaslist_common - WIN_SMALL dm_custom_dyn_gas_column2,dm_custom_dyn_gas_row1 - rcall TFT_dyn_gaslist_common - WIN_SMALL dm_custom_dyn_gas_column2,dm_custom_dyn_gas_row2 - rcall TFT_dyn_gaslist_common - goto TFT_standard_color ; and return... - -TFT_dyn_gaslist_common: - incf uart1_temp,F ; +1 - movf uart1_temp,W ; into W - cpfseq active_gas ;1-5 - bra TFT_dyn_gaslist_common2 - incf uart1_temp,F ; +1 -TFT_dyn_gaslist_common2: - movff uart1_temp,lo ; gas number 1-5 - movff uart1_temp,PRODL - decf PRODL,F ;-1 to have 0-4 - bsf leftbind - output_8 ; Gas number - bcf leftbind - PUTC ":" - bcf ccr_diluent_setup - call gaslist_strcat_gas_mod ;Append gas description of gas #PRODL (0-4) to current string - PUTC " " ; Clearing space - movlw 0x00 - movff WREG,buffer+.11 ; limit to 11 chars - STRCAT_PRINT "" - bcf win_invert - return - - - global TFT_update_avr_stopwatch ; Update average depth and stopwatch + goto TFT_standard_color ; and return... + + global TFT_update_avr_stopwatch ; Update average depth and stopwatch TFT_update_avr_stopwatch: call TFT_standard_color SAFE_2BYTE_COPY average_divesecs,lo - call convert_time ; lo=secs, hi=mins + call convert_time ; lo=secs, hi=mins WIN_MEDIUM dm_custom_avr_stop_column2,dm_custom_avr_stop_row bsf leftbind movf hi,W movff lo,hi - movwf lo ; exchange lo and hi + movwf lo ; exchange lo and hi output_8 PUTC ':' movff hi,lo @@ -1177,28 +1194,28 @@ movff WREG,buffer+.5 ; limit to 5 chars STRCAT_PRINT "" - TSTOSS opt_units ; 0=m, 1=ft + TSTOSS opt_units ; 0=m, 1=ft bra TFT_update_avr_stopwatch_metric ;TFT_update_avr_stopwatch_imperial movff avg_rel_pressure_total+0,lo movff avg_rel_pressure_total+1,hi - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet WIN_MEDIUM dm_custom_avr_stop_column1,dm_custom_avr_stop_row bsf leftbind - output_16 ; yxz + output_16 ; yxz STRCAT_PRINT " " ; Stopped average depth movff avg_rel_pressure+0,lo movff avg_rel_pressure+1,hi - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet WIN_MEDIUM dm_custom_avr_stop_column3,dm_custom_avr_stop_row - output_16 ; yxz + output_16 ; yxz bcf leftbind PUTC " " clrf WREG - movff WREG,buffer+.3 ; limit string length to 3 + movff WREG,buffer+.3 ; limit string length to 3 STRCAT_PRINT "" return @@ -1206,373 +1223,436 @@ ; Non-resettable average depth movff avg_rel_pressure_total+0,lo movff avg_rel_pressure_total+1,hi - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] WIN_MEDIUM dm_custom_avr_stop_column1,dm_custom_avr_stop_row - bsf ignore_digit5 ; no cm - output_16dp .3 ; yxz.a + bsf ignore_digit5 ; no cm + output_16dp .3 ; yxz.a STRCAT_PRINT " " ; Stopped average depth movff avg_rel_pressure+0,lo movff avg_rel_pressure+1,hi - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] WIN_MEDIUM dm_custom_avr_stop_column3,dm_custom_avr_stop_row - bsf ignore_digit5 ; no cm - output_16dp .3 ; yxz.a + bsf ignore_digit5 ; no cm + output_16dp .3 ; yxz.a bcf leftbind bcf ignore_digit5 clrf WREG - movff WREG,buffer+.4 ; limit string length to 4 + movff WREG,buffer+.4 ; limit string length to 4 STRCAT_PRINT "" return - global TFT_ceiling_mask ; The ceiling mask + + global TFT_ceiling_mask ; The ceiling mask TFT_ceiling_mask: call TFT_divemask_color WIN_TINY dm_custom_ceiling_text_column,dm_custom_ceiling_text_row STRCPY_TEXT_PRINT tCeiling - goto TFT_standard_color ; and return... - - global TFT_ceiling ; Ceiling + goto TFT_standard_color ; and return... + + global TFT_ceiling ; Ceiling TFT_ceiling: - call TFT_standard_color WIN_MEDIUM dm_custom_ceiling_value_column,dm_custom_ceiling_value_row movff int_O_ceiling+0,lo movff int_O_ceiling+1,hi - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + TFT_color_code warn_ceiling ; color-code the output + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] bsf leftbind - TSTOSS opt_units ; 0=m, 1=ft + TSTOSS opt_units ; 0=m, 1=ft bra TFT_ceiling_metric ;TFT_ceiling_imperial call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet - output_16 ; yxz + output_16 ; yxz bcf leftbind STRCAT_PRINT " " - return + goto TFT_standard_color TFT_ceiling_metric: - bsf ignore_digit5 ; no cm - output_16dp .3 ; yxz.a + bsf ignore_digit5 ; no cm + output_16dp .3 ; yxz.a bcf leftbind bcf ignore_digit5 STRCAT_PRINT " " - return - - global TFT_hud_mask ; The HUD mask + goto TFT_standard_color + + + global TFT_CNS_mask +TFT_CNS_mask: + call TFT_divemask_color + WIN_TINY dm_custom_gf_title_col1, dm_custom_gf_title_row + STRCPY_TEXT_PRINT tCNSsurf + WIN_TINY dm_custom_gf_title_col2, dm_custom_gf_title_row + btfsc FLAG_ccr_mode ; in CCR mode? + bra TFT_CNS_mask_1 ; YES - proceed with checking for bailout + btfsc FLAG_pscr_mode ; NO - in pSCR mode? + bra TFT_CNS_mask_1 ; YES - proceed with checking for bailout + bra TFT_CNS_mask_2 ; NO - must be OC then +TFT_CNS_mask_1: ; in CCR or pSCR mode + btfsc is_bailout ; in bailout? + bra TFT_CNS_mask_2 ; YES - print fTTS label (label will be printed, but a fTTS will actually not be calculated) + TSTOSS opt_calc_asc_gasvolume ; NO - bailout volume calculation requested? + bra TFT_CNS_mask_2 ; NO - print fTTS label + STRCPY_TEXT_PRINT tCNSBO ; YES - print bailout label + bra TFT_CNS_mask_3 +TFT_CNS_mask_2: ; OC or bailout + STRCPY_TEXT_PRINT tCNSfTTS ; print fTTS label +TFT_CNS_mask_3: + WIN_TINY dm_custom_gf_title_col3, dm_custom_gf_title_row + STRCPY_TEXT_PRINT tCNSnow + goto TFT_standard_color ; and return... + + global TFT_CNS +TFT_CNS: + ; CNS at end of normal dive + WIN_STD dm_custom_hud_sensor1_column+.5,dm_custom_hud_data_row + movff int_O_normal_CNS_fraction+0,lo + movff int_O_normal_CNS_fraction+1,hi + TFT_color_code warn_cns + bsf leftbind + output_16_3 ; output as xxx + bcf leftbind + STRCAT_PRINT "% " + ; fTTS / Bailout CNS, if enabled + WIN_STD dm_custom_hud_sensor2_column+.2,dm_custom_hud_data_row + btfsc is_bailout ; in bailout? + bra TFT_CNS_3 ; YES - show "---" + TSTOSS opt_calc_asc_gasvolume ; NO - bailout volume calculation requested? + bra TFT_CNS_1 ; NO - continue checking fTTS extra time + btfsc FLAG_ccr_mode ; YES - in CCR mode? + bra TFT_CNS_2 ; YES - skip test for fTTS extra time and show CNS% + btfsc FLAG_pscr_mode ; in pSCR mode? + bra TFT_CNS_2 ; YES - skip test for fTTS extra time and show CNS% +TFT_CNS_1: ; not in bailout, no volume calculation + TSTOSS char_I_extra_time ; fTTS extra time fTTS configured? + bra TFT_CNS_3 ; NO - show "---" +TFT_CNS_2: + movff int_O_alternate_CNS_fraction+0,lo ; YES - show CNS% + movff int_O_alternate_CNS_fraction+1,hi + TFT_color_code warn_cns + bsf leftbind + output_16_3 ; output as xxx + bcf leftbind + STRCAT_PRINT "% " + bra TFT_CNS_4 +TFT_CNS_3: + call TFT_standard_color + STRCPY_PRINT "--- " +TFT_CNS_4: + ; current CNS + WIN_STD dm_custom_hud_sensor3_column,dm_custom_hud_data_row + movff int_O_CNS_fraction+0,lo + movff int_O_CNS_fraction+1,hi + TFT_color_code warn_cns + bsf leftbind + output_16_3 ; output as xxx + bcf leftbind + STRCAT_PRINT "%" + bcf leftbind + goto TFT_standard_color ; and return... + + + global TFT_hud_mask ; The HUD mask TFT_hud_mask: call TFT_divemask_color - WIN_TINY dm_custom_hud_column1,dm_custom_hud_row + WIN_TINY dm_custom_hud_column1,dm_custom_hud_row STRCPY_TEXT_PRINT tDiveHudMask1 - WIN_TINY dm_custom_hud_column2,dm_custom_hud_row + WIN_TINY dm_custom_hud_column2,dm_custom_hud_row STRCPY_TEXT_PRINT tDiveHudMask2 - WIN_TINY dm_custom_hud_column3,dm_custom_hud_row + WIN_TINY dm_custom_hud_column3,dm_custom_hud_row STRCPY_TEXT_PRINT tDiveHudMask3 - goto TFT_standard_color ; and return... - - global TFT_hud_voltages -TFT_hud_voltages: ; Show HUD details - WIN_SMALL dm_custom_hud_sensor1_column,dm_custom_hud_data_row - call TFT_standard_color - btfss use_O2_sensor1 - call TFT_warnings_color - movff o2_mv_sensor1+0,lo - movff o2_mv_sensor1+1,hi - bsf leftbind - output_16dp .4 ; x.xx - bcf leftbind - STRCAT_PRINT "mV " - WIN_SMALL dm_custom_hud_sensor2_column,dm_custom_hud_data_row - call TFT_standard_color - btfss use_O2_sensor2 - call TFT_warnings_color - movff o2_mv_sensor2+0,lo - movff o2_mv_sensor2+1,hi - bsf leftbind - output_16dp .4 ; x.xx - bcf leftbind - STRCAT_PRINT "mV " - WIN_SMALL dm_custom_hud_sensor3_column,dm_custom_hud_data_row - call TFT_standard_color - btfss use_O2_sensor3 - call TFT_warnings_color - movff o2_mv_sensor3+0,lo - movff o2_mv_sensor3+1,hi - bsf leftbind - output_16dp .4 ; x.xx - bcf leftbind - STRCAT "mV " - clrf WREG - movff WREG,buffer+.6 ; limit string length to 6 - STRCAT_PRINT "" - goto TFT_standard_color ; and return... + goto TFT_standard_color ; and return... + global TFT_update_ppo2_sensors ; Update Sensor data TFT_update_ppo2_sensors: - ; show three sensors +; +; Definition of the output: +; +; sensorX use voting o2 +; _calibrated _O2 _logic _ppo2 Output Color +; _ok _sensorX _sensorX _sensorX +;----------------------------------------------------------------------------------------------- +; 0 -/- -/- -/- "----" TFT_standard_color +; 1 0 -/- = 0 o2_ppo2_sensorX TFT_attention_color +; 1 0 -/- > 0 o2_ppo2_sensorX TFT_disabled_color +; 1 1 0 -/- o2_ppo2_sensorX TFT_color_code warn_ppo2_hud + win_invert +; 1 1 1 -/- o2_ppo2_sensorX TFT_color_code warn_ppo2_hud +; bsf leftbind - btfsc use_O2_sensor1 ; Use Sensor 1? - bra TFT_update_hud1 ; Yes - btfss dive_hud1_displayed ; Was the sensor shown? - bra TFT_update_hud2 ; Yes, skip clear - bcf dive_hud1_displayed ; No, clear display flag - WIN_BOX_BLACK dm_custom_hud_data_row, dm_customview_bot, dm_custom_hud_sensor1_column, dm_custom_hud_sensor2_column ; top, bottom, left, right - WIN_STD dm_custom_hud_sensor1_column+.7, dm_custom_hud_data_row+.5 - call TFT_standard_color + ; sensor 1 + btfsc sensor1_calibrated_ok ; valid calibration? + bra TFT_update_hud1b ; yes + ; no valid calibration + WIN_STD dm_custom_hud_sensor1_column+.7, dm_custom_hud_data_row+.5 + call TFT_standard_color STRCPY_PRINT "---" - bra TFT_update_hud2 ; Skip Sensor 1 -TFT_update_hud1: - WIN_MEDIUM dm_custom_hud_sensor1_column,dm_custom_hud_data_row - movff o2_ppo2_sensor1,lo - TFT_color_code warn_ppo2_hud ; With ppO2 [cbar] in lo - btfss voting_logic_sensor1 ; Sensor within voting logic? ; Make this configurable? - bsf win_invert ; No, invert output... ; Make this configurable? - btfss voting_logic_sensor1 - call TFT_warnings_color ; ... and draw in red - clrf hi - output_16dp .3 ; x.xx bar + bra TFT_update_hud2a ; continue with sensor 2 +TFT_update_hud1b: + ; sensor has a valid calibration + WIN_MEDIUM dm_custom_hud_sensor1_column,dm_custom_hud_data_row + movff o2_ppo2_sensor1,lo ; load ppO2 value into transfer storage for output + clrf hi ; + btfsc use_O2_sensor1 ; in use? + bra TFT_update_hud1d ; yes + ; valid calibration, but not in use + tstfsz o2_ppo2_sensor1 ; sensor value = 0? + bra TFT_update_hud1c ; no + ; valid calibration, not in use and value = 0 + call TFT_attention_color ; output in yellow + bra TFT_update_hud1e +TFT_update_hud1c: + ; sensor has valid calibration, is not in use and has a value > 0 + call TFT_disabled_color ; output in light blue + bra TFT_update_hud1e +TFT_update_hud1d: + ; sensor has valid calibration and is in use + TFT_color_code warn_ppo2_hud ; With ppO2 [cbar] in lo + btfsc voting_logic_sensor1 ; sensor value agrees with other sensor's values? + bra TFT_update_hud1e ; yes + ; valid calibration, in use, but value does not agree with other sensors + bsf win_invert ; invert output +TFT_update_hud1e: + ; all coloring is set up now, let's write the value to the display! + bsf leftbind + output_16dp .3 ; x.xx bar + bcf leftbind STRCAT_PRINT "" - bcf win_invert - bsf dive_hud1_displayed ; Set display flag -TFT_update_hud2: - btfsc use_O2_sensor2 ; Use Sensor 2? - bra TFT_update_hud3 ; Yes - btfss dive_hud2_displayed ; Was the sensor shown? - bra TFT_update_hud4 ; Yes, skip clear - bcf dive_hud2_displayed ; No, clear display flag - WIN_BOX_BLACK dm_custom_hud_data_row, dm_customview_bot, dm_custom_hud_sensor2_column, dm_custom_hud_sensor3_column ; top, bottom, left, right - WIN_STD dm_custom_hud_sensor2_column+.7, dm_custom_hud_data_row+.5 - call TFT_standard_color + bcf win_invert + +TFT_update_hud2a: ; sensor 2 + btfsc sensor2_calibrated_ok ; valid calibration? + bra TFT_update_hud2b ; yes + ; no valid calibration + WIN_STD dm_custom_hud_sensor2_column+.7, dm_custom_hud_data_row+.5 + call TFT_standard_color STRCPY_PRINT "---" - bra TFT_update_hud4 ; Skip Sensor 2 -TFT_update_hud3: - WIN_MEDIUM dm_custom_hud_sensor2_column,dm_custom_hud_data_row - movff o2_ppo2_sensor2,lo - TFT_color_code warn_ppo2_hud ; With ppO2 [cbar] in lo - btfss voting_logic_sensor2 ; Sensor within voting logic? ; Make this configurable? - bsf win_invert ; No, invert output... ; Make this configurable? - btfss voting_logic_sensor2 - call TFT_warnings_color ; ... and draw in red - clrf hi - output_16dp .3 ; x.xx bar + bra TFT_update_hud3a ; continue with sensor 3 +TFT_update_hud2b: + ; sensor has a valid calibration + WIN_MEDIUM dm_custom_hud_sensor2_column,dm_custom_hud_data_row + movff o2_ppo2_sensor2,lo ; load ppO2 value into transfer storage for output + clrf hi ; + btfsc use_O2_sensor2 ; in use? + bra TFT_update_hud2d ; yes + ; valid calibration, but not in use + tstfsz o2_ppo2_sensor2 ; sensor value = 0? + bra TFT_update_hud2c ; no + ; valid calibration, not in use and value = 0 + call TFT_attention_color ; output in yellow + bra TFT_update_hud2e +TFT_update_hud2c: + ; sensor has valid calibration, is not in use and has a value > 0 + call TFT_disabled_color ; output in light blue + bra TFT_update_hud2e +TFT_update_hud2d: + ; sensor has valid calibration and is in use + TFT_color_code warn_ppo2_hud ; With ppO2 [cbar] in lo + btfsc voting_logic_sensor2 ; sensor value agrees with other sensor's vlaues? + bra TFT_update_hud2e ; yes + ; valid calibration, in use, but value does not agree with other sensors + bsf win_invert ; invert output +TFT_update_hud2e: + ; all coloring is set up now, let's write the value to the display! + bsf leftbind + output_16dp .3 ; x.xx bar + bcf leftbind STRCAT_PRINT "" - bcf win_invert - bsf dive_hud2_displayed ; Set display flag -TFT_update_hud4: - btfsc use_O2_sensor3 ; Use Sensor 3? - bra TFT_update_hud5 ; Yes - btfss dive_hud3_displayed ; Was the sensor shown? - bra TFT_update_hud6 ; Yes, skip clear - bcf dive_hud3_displayed ; No, clear display flag - WIN_BOX_BLACK dm_custom_hud_data_row, dm_customview_bot, dm_custom_hud_sensor3_column, .159 ; top, bottom, left, right - WIN_STD dm_custom_hud_sensor3_column+.7, dm_custom_hud_data_row+.5 - call TFT_standard_color + bcf win_invert + +TFT_update_hud3a: ; sensor 3 + btfsc sensor3_calibrated_ok ; valid calibration? + bra TFT_update_hud3b ; yes + ; no valid calibration + WIN_STD dm_custom_hud_sensor3_column+.7, dm_custom_hud_data_row+.5 + call TFT_standard_color STRCPY_PRINT "---" - bra TFT_update_hud6 ; Skip Sensor 3 -TFT_update_hud5: - WIN_MEDIUM dm_custom_hud_sensor3_column,dm_custom_hud_data_row - movff o2_ppo2_sensor3,lo - TFT_color_code warn_ppo2_hud ; With ppO2 [cbar] in lo - btfss voting_logic_sensor3 ; Sensor within voting logic? ; Make this configurable? - bsf win_invert ; No, invert output... ; Make this configurable? - btfss voting_logic_sensor3 - call TFT_warnings_color ; ... and draw in red - clrf hi - output_16dp .3 ; x.xx bar + bra TFT_update_hud4 ; done +TFT_update_hud3b: + ; sensor has a valid calibration + WIN_MEDIUM dm_custom_hud_sensor3_column,dm_custom_hud_data_row + movff o2_ppo2_sensor3,lo ; load ppO2 value into transfer storage for output + clrf hi ; + btfsc use_O2_sensor3 ; in use? + bra TFT_update_hud3d ; yes + ; valid calibration, but not in use + tstfsz o2_ppo2_sensor3 ; sensor value = 0? + bra TFT_update_hud3c ; no + ; valid calibration, not in use and value = 0 + call TFT_attention_color ; output in yellow + bra TFT_update_hud3e +TFT_update_hud3c: + ; sensor has valid calibration, is not in use and has a value > 0 + call TFT_disabled_color ; output in light blue + bra TFT_update_hud3e +TFT_update_hud3d: + ; sensor has valid calibration and is in use + TFT_color_code warn_ppo2_hud ; With ppO2 [cbar] in lo + btfsc voting_logic_sensor3 ; sensor value agrees with other sensor's vlaues? + bra TFT_update_hud3e ; yes + ; valid calibration, in use, but value does not agree with other sensors + bsf win_invert ; invert output +TFT_update_hud3e: + ; all coloring is set up now, let's write the value to the display! + bsf leftbind + output_16dp .3 ; x.xx bar + bcf leftbind STRCAT_PRINT "" - bcf win_invert - bsf dive_hud3_displayed ; Set display flag -TFT_update_hud6: + bcf win_invert + +TFT_update_hud4: ; closure bcf leftbind - goto TFT_standard_color ; and return... - - - global TFT_surface_sensor ; Update Sensor data in surface mode + goto TFT_standard_color ; and return... + + + global TFT_surface_sensor ; Update Sensor data in surface mode TFT_surface_sensor: movf hardware_flag,W - sublw 0x11 ; 2 with BLE + sublw 0x11 ; 2 with BLE btfsc STATUS,Z - return ; Ignore for 0x11 - + return ; Ignore for 0x11 ; show three sensors bsf leftbind WIN_SMALL surf_hud_sensor1_column,surf_hud_sensor1_row - btfsc use_O2_sensor1 ; Use Sensor 1? - bra TFT_surface_sensor1 ; Yes + btfsc sensor1_calibrated_ok + bra TFT_surface_sensor1 ; Yes call TFT_standard_color STRCPY_PRINT "--- " - bra TFT_surface_sensor2 ; Skip Sensor 1 + bra TFT_surface_sensor2 ; Skip Sensor 1 TFT_surface_sensor1: movff o2_ppo2_sensor1,lo TFT_color_code warn_ppo2_hud ; With ppO2 [cbar] in lo clrf hi - output_16dp .3 ; x.xx bar + bsf leftbind + output_16dp .3 ; x.xx bar + bcf leftbind STRCAT_PRINT "" TFT_surface_sensor2: WIN_SMALL surf_hud_sensor2_column,surf_hud_sensor2_row - btfsc use_O2_sensor2 ; Use Sensor 2? - bra TFT_surface_sensor3 ; Yes + btfsc sensor2_calibrated_ok + bra TFT_surface_sensor3 ; Yes call TFT_standard_color STRCPY_PRINT "--- " - bra TFT_surface_sensor4 ; Skip Sensor 2 + bra TFT_surface_sensor4 ; Skip Sensor 2 TFT_surface_sensor3: movff o2_ppo2_sensor2,lo TFT_color_code warn_ppo2_hud ; With ppO2 [cbar] in lo clrf hi - output_16dp .3 ; x.xx bar + bsf leftbind + output_16dp .3 ; x.xx bar + bcf leftbind STRCAT_PRINT "" TFT_surface_sensor4: WIN_SMALL surf_hud_sensor3_column,surf_hud_sensor3_row - btfsc use_O2_sensor3 ; Use Sensor 3? - bra TFT_surface_sensor5 ; Yes + btfsc sensor3_calibrated_ok + bra TFT_surface_sensor5 ; Yes call TFT_standard_color STRCPY_PRINT "--- " - bra TFT_surface_sensor6 ; Skip Sensor 3 + bra TFT_surface_sensor6 ; Skip Sensor 3 TFT_surface_sensor5: movff o2_ppo2_sensor3,lo TFT_color_code warn_ppo2_hud ; With ppO2 [cbar] in lo clrf hi - output_16dp .3 ; x.xx bar + bsf leftbind + output_16dp .3 ; x.xx bar + bcf leftbind STRCAT_PRINT "" TFT_surface_sensor6: bcf leftbind goto TFT_standard_color; and return... - + + global TFT_sensor_mV TFT_sensor_mV: call TFT_standard_color bsf leftbind WIN_SMALL surf_mV_sensor_column,surf_mV_sensor1_row - movff o2_mv_sensor1+0,lo ; in 0.1mV steps - movff o2_mv_sensor1+1,hi ; in 0.1mV steps + movff o2_mv_sensor1+0,lo ; in 0.1mV steps + movff o2_mv_sensor1+1,hi ; in 0.1mV steps STRCAT "1: " - output_16dp .4 ; xxx.y mV + output_16dp .4 ; xxx.y mV STRCAT_PRINT "mV " WIN_SMALL surf_mV_sensor_column,surf_mV_sensor2_row - movff o2_mv_sensor2+0,lo ; in 0.1mV steps - movff o2_mv_sensor2+1,hi ; in 0.1mV steps + movff o2_mv_sensor2+0,lo ; in 0.1mV steps + movff o2_mv_sensor2+1,hi ; in 0.1mV steps STRCAT "2: " - output_16dp .4 ; xxx.y mV + output_16dp .4 ; xxx.y mV STRCAT_PRINT "mV " WIN_SMALL surf_mV_sensor_column,surf_mV_sensor3_row - movff o2_mv_sensor3+0,lo ; in 0.1mV steps - movff o2_mv_sensor3+1,hi ; in 0.1mV steps + movff o2_mv_sensor3+0,lo ; in 0.1mV steps + movff o2_mv_sensor3+1,hi ; in 0.1mV steps STRCAT "3: " - output_16dp .4 ; xxx.y mV + output_16dp .4 ; xxx.y mV STRCAT_PRINT "mV " bcf leftbind - goto TFT_standard_color ; and return... + goto TFT_standard_color ; and return... + global TFT_sensor_surface_warning TFT_sensor_surface_warning: - call TFT_warnings_color - movff opt_x_s1+1,lo ; into bank1 - movf lo,W ; when opt_x_s1 > 255 the sensor will just give 8 mV at a ppO2 of 0,21 any more - bz TFT_sensor_mV2 ; the sensor is not too bad yet for a warning + call TFT_warnings_color + btfss sensor1_calibrated_ok ; do not show end of lifetime arrow if sensor failed calibration at all + bra TFT_sensor_mV2 + movff opt_x_s1+1,lo ; into bank1 + movf lo,W ; when opt_x_s1 > 255 the sensor will just give 8 mV at a ppO2 of 0,21 any more + bz TFT_sensor_mV2 ; the sensor is not too bad yet for a warning WIN_SMALL surf_mV_sensor_status_column,surf_mV_sensor1_row-.5 - STRCPY_PRINT "\xb8" ; mark sensor as beeing at end of lifetime + STRCPY_PRINT "\xb8" ; mark sensor as being at end of lifetime TFT_sensor_mV2: - movff opt_x_s2+1,lo ; into bank1 - movf lo,W ; when opt_x_s2 > 255 the sensor will just give 8 mV at a ppO2 of 0,21 any more - bz TFT_sensor_mV3 ; the sensor is not too bad yet for a warning + btfss sensor2_calibrated_ok ; do not show end of lifetime arrow if sensor failed calibration at all + bra TFT_sensor_mV3 + movff opt_x_s2+1,lo ; into bank1 + movf lo,W ; when opt_x_s2 > 255 the sensor will just give 8 mV at a ppO2 of 0,21 any more + bz TFT_sensor_mV3 ; the sensor is not too bad yet for a warning WIN_SMALL surf_mV_sensor_status_column,surf_mV_sensor2_row-.5 - STRCPY_PRINT "\xb8" ; mark sensor as beeing at end of lifetime + STRCPY_PRINT "\xb8" ; mark sensor as being at end of lifetime TFT_sensor_mV3: - movff opt_x_s3+1,lo ; into bank1 - movf lo,W ; when opt_x_s3 > 255 the sensor will just give 8 mV at a ppO2 of 0,21 any more - bz TFT_sensor_mV4 ; the sensor is not too bad yet for a warning + btfss sensor3_calibrated_ok ; do not show end of lifetime arrow if sensor failed calibration at all + bra TFT_sensor_mV4 + movff opt_x_s3+1,lo ; into bank1 + movf lo,W ; when opt_x_s3 > 255 the sensor will just give 8 mV at a ppO2 of 0,21 any more + bz TFT_sensor_mV4 ; the sensor is not too bad yet for a warning WIN_SMALL surf_mV_sensor_status_column,surf_mV_sensor3_row-.5 - STRCPY_PRINT "\xb8" ; mark sensor as beeing at end of lifetime + STRCPY_PRINT "\xb8" ; mark sensor as beeing at end of lifetime TFT_sensor_mV4: - goto TFT_standard_color ; (And return) Done. - - global TFT_menu_hud -TFT_menu_hud: ; Yes, update HUD data - call compute_ppo2 ; compute mv_sensorX and ppo2_sensorX arrays - call TFT_attention_color ; show in yellow - bsf leftbind - WIN_SMALL surf_menu_sensor1_column,surf_menu_sensor1_row - movff o2_ppo2_sensor1,lo - clrf hi - output_16dp .3 ; x.xx bar - PUTC "," - movff o2_mv_sensor1+0,lo ; in 0.1mV steps - movff o2_mv_sensor1+1,hi ; in 0.1mV steps - output_16dp .4 ; xxx.y mV - STRCAT "mV " - clrf WREG - movff WREG,buffer+.10 ; limit string length to 10 - STRCAT_PRINT "" - WIN_SMALL surf_menu_sensor2_column,surf_menu_sensor2_row - movff o2_ppo2_sensor2,lo - clrf hi - output_16dp .3 ; x.xx bar - PUTC "," - movff o2_mv_sensor2+0,lo ; in 0.1mV steps - movff o2_mv_sensor2+1,hi ; in 0.1mV steps - output_16dp .4 ; xxx.y mV - STRCAT "mV " - clrf WREG - movff WREG,buffer+.10 ; limit string length to 10 - STRCAT_PRINT "" - WIN_SMALL surf_menu_sensor3_column,surf_menu_sensor3_row - movff o2_ppo2_sensor3,lo - clrf hi - output_16dp .3 ; x.xx bar - PUTC "," - movff o2_mv_sensor3+0,lo ; in 0.1mV steps - movff o2_mv_sensor3+1,hi ; in 0.1mV steps - output_16dp .4 ; xxx.y mV - STRCAT "mV " - clrf WREG - movff WREG,buffer+.10 ; limit string length to 10 - STRCAT_PRINT "" - WIN_SMALL surf_menu_sensor4_column,surf_menu_sensor4_row - - btfss analog_o2_input - bra TFT_menu_hud_2 ; always for normal OSTC3 - btfss s8_digital - return ; Not for analog -TFT_menu_hud_2: - STRCPY "Batt:" - movff hud_battery_mv+0,lo ; in mV - movff hud_battery_mv+1,hi ; in mV - output_16dp .2 ; x.yyy V - STRCAT_PRINT "V" - call TFT_standard_color - bcf leftbind - return + goto TFT_standard_color ; ...and return + global TFT_menu_calibrate -TFT_menu_calibrate: ; update mV data in calibration menu - call compute_ppo2 ; compute mv_sensorX and ppo2_sensorX arrays +TFT_menu_calibrate: ; update mV data in calibration menu + btfss s8_digital ; =1: Digital I/O + bra TFT_menu_calibrate_analog ; use analog +TFT_menu_calibrate_wait: + btfss new_s8_data_available ; =1: New data frame recieved + bra TFT_menu_calibrate_wait + call compute_mvolts_for_all_sensors + bra TFT_menu_calibrate_common +TFT_menu_calibrate_analog: + call get_analog_inputs +TFT_menu_calibrate_common: call TFT_attention_color ; show in yellow bsf leftbind WIN_SMALL surf_menu_sensor1_column,surf_menu2_sensor1_row - movff o2_mv_sensor1+0,lo ; in 0.1mV steps - movff o2_mv_sensor1+1,hi ; in 0.1mV steps - output_16dp .4 ; xxx.y mV + movff o2_mv_sensor1+0,lo ; in 0.1mV steps + movff o2_mv_sensor1+1,hi ; in 0.1mV steps + output_16dp .4 ; xxx.y mV STRCAT_PRINT "mV " WIN_SMALL surf_menu_sensor2_column,surf_menu2_sensor2_row - movff o2_mv_sensor2+0,lo ; in 0.1mV steps - movff o2_mv_sensor2+1,hi ; in 0.1mV steps - output_16dp .4 ; xxx.y mV + movff o2_mv_sensor2+0,lo ; in 0.1mV steps + movff o2_mv_sensor2+1,hi ; in 0.1mV steps + output_16dp .4 ; xxx.y mV STRCAT_PRINT "mV " WIN_SMALL surf_menu_sensor3_column,surf_menu2_sensor3_row - movff o2_mv_sensor3+0,lo ; in 0.1mV steps - movff o2_mv_sensor3+1,hi ; in 0.1mV steps - output_16dp .4 ; xxx.y mV + movff o2_mv_sensor3+0,lo ; in 0.1mV steps + movff o2_mv_sensor3+1,hi ; in 0.1mV steps + output_16dp .4 ; xxx.y mV STRCAT_PRINT "mV " -; WIN_SMALL surf_menu2_ambient_column,surf_menu2_ambient_row -; PUTC "@" -; SAFE_2BYTE_COPY amb_pressure, lo -; output_16 -; STRCAT_TEXT tMBAR ; mbar -; STRCAT_PRINT " " bcf leftbind - goto TFT_standard_color ; and return... - - global TFT_clock + goto TFT_standard_color ; ...and return + + + global TFT_clock TFT_clock: WIN_SMALL surf_clock_column,surf_clock_row TFT_clock2: ; called from divemode clock @@ -1608,42 +1688,20 @@ call TFT_convert_date ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2 STRCAT_PRINT " " return + ;============================================================================= - global TFT_interval -TFT_interval: - call TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; No - call TFT_warning_set_window_com - STRCPY "Int:" - movff surface_interval+0,lo - movff surface_interval+1,hi - call convert_time ; lo=mins, hi=hours - movf hi,W - movff lo,hi - movwf lo ; exchange lo and hi - output_99x - PUTC ':' - movff hi,lo - output_99x - movlw surf_warning_length ; No, use surface string length - call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - STRCAT_PRINT "" - bcf win_invert - return - global TFT_surface_decosettings ; Show all deco settings TFT_surface_decosettings: - ; Deco Mode + ; Deco Mode call TFT_standard_color + WIN_SMALL surf_gaslist_column,surf_gaslist_row + STRCAT_PRINT "ZH-L16" movff char_I_deco_model,WREG iorwf WREG bnz TFT_surface_decosettings1 - - ; Display ZH-L16 sat/desat model. - TEXT_SMALL surf_gaslist_column,surf_gaslist_row, tZHL16 - WIN_TOP surf_gaslist_row+(surf_gaslist_spacing*.1) + ; Display ZH-L16 sat/desat model + WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.1) lfsr FSR2,buffer movff char_I_desaturation_multiplier,lo bsf leftbind @@ -1653,43 +1711,38 @@ output_8 STRCAT_PRINT "%" bra TFT_surface_decosettings2 - - ; Display ZH-L16-GF low/high model. + ; Display ZH-L16-GF low/high model TFT_surface_decosettings1: - TEXT_SMALL surf_gaslist_column,surf_gaslist_row, tZHL16GF - WIN_TOP surf_gaslist_row+(surf_gaslist_spacing*.1) - STRCPY_TEXT tGF ; GF: - movff char_I_GF_Low_percentage,lo + TEXT_SMALL surf_gaslist_column+.43,surf_gaslist_row,tZHL16GF + WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.1) + STRCPY_TEXT tGF ; GF: + movff opt_GF_low,lo output_99x STRCAT "/" - movff char_I_GF_High_percentage,lo + movff opt_GF_high,lo output_99x STRCAT_PRINT "" - ;bra TFT_surface_decosettings2 -TFT_surface_decosettings2: - ; FTTS - WIN_TOP surf_gaslist_row+(surf_gaslist_spacing*.2) +TFT_surface_decosettings2: ; fTTS + WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.2) STRCPY_TEXT tFTTSMenu movff char_I_extra_time,lo bsf leftbind output_8 STRCAT_TEXT_PRINT tMinutes - ; Last Stop - WIN_TOP surf_gaslist_row+(surf_gaslist_spacing*.3) + WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.3) STRCPY_TEXT tLastDecostop - movff char_I_depth_last_deco,lo + movff opt_last_stop,lo output_8 STRCAT_TEXT_PRINT tMeters - ; Salinity - WIN_TOP surf_gaslist_row+(surf_gaslist_spacing*.4) + WIN_SMALL surf_gaslist_column,surf_gaslist_row+(surf_gaslist_spacing*.4) STRCPY_TEXT tDvSalinity movff opt_salinity,lo output_8 bcf leftbind STRCAT_TEXT_PRINT tPercent - return ; Done. + return global TFT_debug_output TFT_debug_output: @@ -1705,21 +1758,20 @@ STRCAT_PRINT "" return - global TFT_divetimeout ; Show timeout counter + global TFT_divetimeout ; Show timeout counter TFT_divetimeout: call TFT_warning_set_window ; Sets the row and column for the current warning tstfsz WREG ; Is there room for the warning? return ; No - call TFT_warning_set_window_com call TFT_standard_color STRCPY 0x94 ; "End of dive" icon movff opt_diveTimeout,WREG ; in [min] mullw .60 movff PRODL,sub_a+0 - movff PRODH,sub_a+1 ; in [s] + movff PRODH,sub_a+1 ; in [s] movff timeout_counter,sub_b+0 movff timeout_counter2,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b (with UNSIGNED values) + call subU16 ; sub_c = sub_a - sub_b (with UNSIGNED values) movff sub_c+0, lo movff sub_c+1, hi call convert_time ; converts hi:lo in minutes to hours (hi) and minutes (lo) @@ -1730,137 +1782,153 @@ PUTC ':' movff hi,lo output_99x - movlw dm_warning_length ; Divemode string length - call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + movlw dm_warning_length ; Divemode string length + call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) STRCAT_PRINT "" bcf win_invert return - global TFT_ftts -TFT_ftts: + global TFT_display_ftts +TFT_display_ftts: movff char_I_extra_time,lo tstfsz lo - bra $+4 - return ; char_I_extra_time=0, return. - - if dm_offset !=0 - incf warning_counter,F ; increase counter - call TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; No - call TFT_warning_set_window_com - else - btfsc divemode_menu ; Is the dive mode menu shown? - return ; Yes, return - call TFT_standard_color - WIN_SMALL dm_ftts_value_column, dm_ftts_value_row - endif - - movff char_I_extra_time,lo - STRCPY "@+" + bra TFT_display_ftts_a + return ; char_I_extra_time=0, return. +TFT_display_ftts_a: + movff int_O_alternate_ascenttime+0,WREG + movff int_O_alternate_ascenttime+1,hi + iorwf hi,W ; int_O_alternate_ascenttime:2 == 0 ? + bnz TFT_display_ftts_b + return ; No deco, do nothing +TFT_display_ftts_b: + btfsc is_bailout ; check if we are in bailout mode + return ; YES - in bailout no fTTS will be computed, so nothing to display + incf warning_counter,F ; increase counter + call TFT_warning_set_window ; sets the row and column for the current warning + tstfsz WREG ; is there room for the warning? + return ; NO + btfsc FLAG_ccr_mode ; in CCR mode? + bra TFT_display_ftts_1 ; YES - print fTTS label + btfsc FLAG_pscr_mode ; NO - in pSCR mode? + bra TFT_display_ftts_1 ; YES - print fTTS label + bra TFT_display_ftts_2 ; NO - must be OC then +TFT_display_ftts_1: ; in CCR or pSCR mode + btfsc is_bailout ; in bailout? + bra TFT_display_ftts_2 ; YES - print fTTS label + TSTOSS opt_calc_asc_gasvolume ; NO - bailout volume calculation requested? + bra TFT_display_ftts_2 ; NO - print fTTS label + STRCPY "B/O" ; YES - print bailout label + bra TFT_display_ftts_3 +TFT_display_ftts_2: ; OC or bailout + STRCPY "@+" ; print fTTS label +TFT_display_ftts_3: + movff char_I_extra_time,lo bsf leftbind output_8 PUTC ":" - movff int_O_extra_ascenttime+0,lo - movff int_O_extra_ascenttime+1,hi - movf lo,W - iorwf hi,W ; extra_ascenttime == 0 ? - bz TFT_ftts2 ; No deco - movf lo,W ; extra_ascenttime == 0xFFFF ? - andwf hi,W - incf WREG,w - bz TFT_ftts2 ; Wait... - output_16 - bcf leftbind + movff int_O_alternate_ascenttime+0,lo + movff int_O_alternate_ascenttime+1,hi + btfss hi,int_invalid_flag ; is the invalid flag set? + bra TFT_display_ftts1 ; NO + bcf hi,int_invalid_flag ; YES - clear flag + call TFT_disabled_color ; switch to disabled color +TFT_display_ftts1: + movf lo,W + iorwf hi,W ; extra_ascenttime == 0 ? + bz TFT_display_ftts2 ; YES - show dashes + btfsc hi,int_not_yet_computed ; is the not-computed-yet flag set? + bra TFT_display_ftts2 ; YES + output_16 ; NO + bcf leftbind PUTC "'" - movlw dm_warning_length ; Divemode string length - call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + movlw dm_warning_length ; Divemode string length + call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) STRCAT_PRINT "" bcf win_invert - return - -TFT_ftts2: + goto TFT_standard_color ; ...and return +TFT_display_ftts2: STRCAT "---" bcf leftbind - movlw dm_warning_length ; Divemode string length - call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + movlw dm_warning_length ; Divemode string length + call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) STRCAT_PRINT "" bcf win_invert - return + goto TFT_standard_color ; ...and return ;============================================================================= - - global TFT_temp_surfmode + + global TFT_temp_surfmode TFT_temp_surfmode: call TFT_divemask_color - WIN_SMALL surf_temp_column+3*8,surf_temp_row - TSTOSS opt_units ; 0=°C, 1=°F - bra TFT_temp_surfmode_metric - STRCAT_TEXT tLogTunitF ; °F - bra TFT_temp_surfmode_common + WIN_SMALL surf_temp_column+3*8,surf_temp_row + TSTOSS opt_units ; 0=°C, 1=°F + bra TFT_temp_surfmode_metric + STRCAT_TEXT tLogTunitF ; °F + bra TFT_temp_surfmode_common TFT_temp_surfmode_metric: - STRCAT_TEXT tLogTunitC ; °C + STRCAT_TEXT tLogTunitC ; °C TFT_temp_surfmode_common: - STRCAT_PRINT "" - WIN_SMALL surf_temp_column,surf_temp_row - bra TFT_temp_common - - global TFT_temp_divemode + STRCAT_PRINT "" + WIN_SMALL surf_temp_column,surf_temp_row + bra TFT_temp_common + + global TFT_temp_divemode TFT_temp_divemode: - btfsc divemode_menu ; Is the dive mode menu shown? - return ; Yes, no update of temperature now - btfsc blinking_better_gas ; blinking better Gas? - return ; Yes, no update of temperature now - WIN_SMALL dm_temp_column,dm_temp_row - + bcf FLAG_TFT_temp_divemode + btfsc divemode_menu ; Is the dive mode menu shown? + return ; Yes, no update of temperature now + btfsc blinking_better_gas ; blinking better Gas? + return ; Yes, no update of temperature now + WIN_SMALL dm_temp_column,dm_temp_row TFT_temp_common: - call TFT_standard_color - SAFE_2BYTE_COPY temperature, lo ; get current temperature - TSTOSS opt_units ; 0=°C, 1=°F - bra TFT_temp_common_1 - call convert_celsius_to_fahrenheit ; convert value in lo:hi from celsius to fahrenheit + call TFT_standard_color + SAFE_2BYTE_COPY temperature,lo ; get current temperature + TSTOSS opt_units ; 0=°C, 1=°F + bra TFT_temp_common_1 + call convert_celsius_to_fahrenheit ; convert value in lo:hi from celsius to fahrenheit TFT_temp_common_1: - rcall TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required - btfsc neg_flag ; is the temperature negative? - bra TFT_temp_common_2 ; YES - the minus sign has already been written - ; temp is positive, is it less then 10°C? - tstfsz hi - bra TFT_temp_common_1a ; >25,5°C, skip here - movlw .100 - cpfslt lo - bra TFT_temp_common_1a ; >10,0°C, skip here - bsf leftbind - output_16dp d'4' ; x.y°C - bcf leftbind - bra TFT_temp_common_3 ; Done. + rcall TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required + btfsc neg_flag ; is the temperature negative? + bra TFT_temp_common_2 ; YES - the minus sign has already been written + ; temp is positive, is it less then 10°C? + tstfsz hi + bra TFT_temp_common_1a ; >25.5°C, skip here + movlw .100 + cpfslt lo + bra TFT_temp_common_1a ; >10.0°C, skip here + bsf leftbind + output_16dp d'4' ; x.y°C + bcf leftbind + bra TFT_temp_common_3 ; Done. TFT_temp_common_1a: - PUTC " " ; NO - write a space instead of the minus sign + PUTC " " ; NO - write a space instead of the minus sign TFT_temp_common_2: - bsf ignore_digit5 ; ignore decimal - output_16_3 ; output 0-999 without decimal -> writes ' ' - 99 - bcf ignore_digit5 - movff buffer+2,lo ; get output from unit position - movlw " " ; load code of the space character - cpfseq lo ; is there a space sign on the unit position? (happens between +1 and -1) - bra TFT_temp_common_3 ; NO - movff WREG,buffer+0 ; YES - replace potential minus sign with a space (temps from -0.9° to -0.1° else would appear as '- 0') - movlw "0" ; load code of the zero character - movff WREG,buffer+2 ; replace space with a zero + bsf ignore_digit5 ; ignore decimal + output_16_3 ; output 0-999 without decimal -> writes ' ' - 99 + bcf ignore_digit5 + movff buffer+2,lo ; get output from unit position + movlw " " ; load code of the space character + cpfseq lo ; is there a space sign on the unit position? (happens between +1 and -1) + bra TFT_temp_common_3 ; NO + movff WREG,buffer+0 ; YES - replace potential minus sign with a space (temps from -0.9° to -0.1° else would appear as '- 0') + movlw "0" ; load code of the zero character + movff WREG,buffer+2 ; replace space with a zero TFT_temp_common_3: - btfss divemode ; are we in dive mode? - bra TFT_temp_common_5 ; NO - no unit to append - TSTOSS opt_units ; YES - check unit type: 0=°C, 1=°F - bra TFT_temp_common_4 ; go metric - STRCAT_TEXT tLogTunitF ; append °F - bra TFT_temp_common_5 + btfss divemode ; are we in dive mode? + bra TFT_temp_common_5 ; NO - no unit to append + TSTOSS opt_units ; YES - check unit type: 0=°C, 1=°F + bra TFT_temp_common_4 ; go metric + STRCAT_TEXT tLogTunitF ; append °F + bra TFT_temp_common_5 TFT_temp_common_4: - STRCAT_TEXT tLogTunitC ; append °C + STRCAT_TEXT tLogTunitC ; append °C TFT_temp_common_5: - STRCAT_PRINT "" ; output to screen - return - + STRCAT_PRINT "" ; output to screen + return + ;============================================================================= + global TFT_divemode_menu_cursor TFT_divemode_menu_cursor: WIN_BOX_BLACK dm_menu_row+.1, dm_menu_lower-.1, dm_menu_item1_column-.8, dm_menu_item1_column-.1 @@ -1868,11 +1936,11 @@ call TFT_standard_color movlw dm_menu_item1_column-.8 - btfsc menupos,2 ; >3? - movlw dm_menu_item4_column-.8 ; Yes + btfsc menupos,2 ; >3? + movlw dm_menu_item4_column-.8 ; Yes movff WREG,win_leftx2 - movff menupos,lo ; Copy menu pos + movff menupos,lo ; Copy menu pos movlw dm_menu_item6_row dcfsnz lo,F movlw dm_menu_item1_row @@ -1887,225 +1955,169 @@ movff WREG,win_top movlw FT_SMALL movff WREG,win_font - STRCPY_PRINT "\xb7" ; print cursor - return - -TFT_active_setpoint2: - movff char_I_const_ppO2,lo - TFT_color_code warn_ppo2_hud ; With ppO2 [cbar] in lo - clrf hi - bsf leftbind - output_16dp d'3' - bcf leftbind - STRCAT_TEXT tbar - movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP - sublw .1 ; opt_ccr_mode = 1 (Sensor)? - bnz TFT_active_setpoint2_a ; No, skip - PUTC "*" -TFT_active_setpoint2_a: - STRCAT_PRINT "" + STRCPY_PRINT "\xb7" ; print cursor return -TFT_active_setpoint: ; Show setpoint - WIN_STD dm_active_gas_column, dm_active_gas_row - call TFT_standard_color - btfsc is_bailout ; =1: Bailout - bra TFT_active_setpoint_bail ; Show "Bailout" instead of Setpoint - - rcall TFT_active_setpoint2 ; show setpoint (Non-Inverted in all cases) - - ; ****** new from R.L.****** - btg blinking_setpoint ; Toggle blink bit... - - btfss blinking_setpoint ; blink now? - bra TFT_active_setpoint_diluent ; no - Done. If no blink now, no need to do all checks - - btfsc setpoint_fallback ; =1: Fallback to SP1 due to external O2 sensor failure - bra TFT_active_setpoint_b ; not clear, so process fallback case - - movff char_I_const_ppO2, lo ; get current ppO2 - movff opt_ppO2_max, WREG ; PPO2 Max for MOD calculation and color coding - cpfsgt lo ; lo > opt_ppO2_max? - Bra TFT_active_setpoint_d ; No ? continue with checking for low ppO2 condition - Bra TFT_active_setpoint_e ; Yes ? set up blinking for ppO2 problem case - -TFT_active_setpoint_d: - movff opt_ppO2_min, WREG ; PPO2 min for Sensors and color coding - cpfslt lo ; lo < opt_ppO2_min? - bra TFT_active_setpoint_diluent ; No ? ppO2 is ok, continue with displaying diluent - ;bra TFT_active_setpoint_e ; Yes ? set up blinking for ppO2 problem case - -TFT_active_setpoint_e: ; set up blinking for ppO2 problem case - movlw color_red ; blink in red - call TFT_set_color - bra TFT_active_setpoint_c ; continue with blinking common part -TFT_active_setpoint_b: ; set up blinking for fallback case - movlw color_yellow ; blink in yellow - call TFT_set_color - ; bra TFT_active_setpoint_c ; just for clarity in the code -TFT_active_setpoint_c: ; blinking common part - ; ****** new from R.L.****** - - bsf win_invert ; Set invert flag - WIN_STD dm_active_gas_column, dm_active_gas_row - movff char_I_const_ppO2,lo - clrf hi - bsf leftbind - output_16dp d'3' - bcf leftbind - STRCAT_TEXT tbar - movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP - sublw .1 ; opt_ccr_mode = 1 (Sensor)? - bnz TFT_active_setpoint_a ; No, skip - PUTC "*" -TFT_active_setpoint_a: - STRCAT_PRINT "" - bcf win_invert ; Reset invert flag - -TFT_active_setpoint_diluent: - call TFT_standard_color - if dm_offset != 0 - WIN_SMALL dm_active_dil_column, dm_active_dil_row - else - WIN_STD dm_active_dil_column, dm_active_dil_row - endif - movff char_I_O2_ratio,lo ; lo now stores O2 in % - movff char_I_He_ratio,hi ; hi now stores He in % - rcall TFT_show_dil_divemode2 ; Show diluent (Non-Inverted in all cases) - - btfss better_gas_available ; =1: A better gas is available and a gas change is advised in divemode - return ; Done. - btg blinking_better_gas ; Toggle blink bit... - btfss blinking_better_gas ; blink now? - return ; No, Done. - - movlw color_yellow ; Blink in yellow - call TFT_set_color - bsf win_invert ; Set invert flag - if dm_offset != 0 - WIN_SMALL dm_active_dil_column, dm_active_dil_row - else - WIN_STD dm_active_dil_column, dm_active_dil_row - endif - movff char_I_O2_ratio,lo ; lo now stores O2 in % - movff char_I_He_ratio,hi ; hi now stores He in % - rcall TFT_show_dil_divemode2 ; Show gas - bcf win_invert ; Reset invert flag - goto TFT_standard_color; and return... - -TFT_show_dil_divemode2: - call customview_show_mix ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 - STRCAT_PRINT "" - return - -TFT_active_setpoint_bail: - WIN_SMALL dm_active_gas_column, dm_active_gas_row+.3 ; colides with diluent in FT_MEDIUM - STRCPY_TEXT_PRINT tDiveBailout ; Bailout - bra TFT_active_setpoint_diluent - -TFT_show_pscr_mode_divemode: - WIN_TINY dm_active_dil_column, dm_active_dil_row+.1 - btfsc is_bailout ; =1: Bailout - bra TFT_show_pscr_mode_divemode_bail ; Show "Bailout" instead of PSCR - STRCPY_TEXT_PRINT tDvPSCR ; PSCR - return - -TFT_show_pscr_mode_divemode_bail: - STRCPY_TEXT_PRINT tDiveBailout ; Bailout - return - global TFT_active_gas_divemode TFT_active_gas_divemode: ; Display gas/Setpoint + bcf FLAG_TFT_active_gas_divemode btfsc divemode_menu ; Is the dive mode menu shown? return ; Yes, return - btfsc FLAG_apnoe_mode ; Ignore in Apnoe mode + btfsc FLAG_apnoe_mode ; Ignore in Apnoe mode return btfsc FLAG_ccr_mode ; in CCR mode? - bra TFT_active_setpoint ; Yes, show setpoint - - call TFT_standard_color - - btfsc FLAG_pscr_mode ; in PSCR mode? - rcall TFT_show_pscr_mode_divemode ; Yes, show "PSCR" - - WIN_STD dm_active_gas_column, dm_active_gas_row - movff char_I_O2_ratio,lo ; lo now stores O2 in % - movff char_I_He_ratio,hi ; hi now stores He in % - rcall TFT_active_gas_divemode2 ; Show gas (Non-Inverted in all cases) - btfss better_gas_available ; =1: A better gas is available and a gas change is advised in divemode - return ; Done. - - btg blinking_better_gas ; Toggle blink bit... - btfss blinking_better_gas ; blink now? - return ; No, Done. - call TFT_attention_color ; blink in yellow - bsf win_invert ; Set invert flag + bra TFT_active_setpoint ; Yes, show setpoint and gas mix + btfsc FLAG_pscr_mode ; in PSCR mode? + bra TFT_active_setpoint ; Yes, show setpoint and gas mix + call TFT_standard_color + btfss better_gas_available ; check if a better gas is available and a gas change is advised in divemode + bra TFT_active_gas_divemode2 ; NO - print in normal rendering + btg blinking_better_gas ; YES - toggle blink bit + btfss blinking_better_gas ; blink now? + bra TFT_active_gas_divemode2 ; NO - print in normal rendering + call TFT_attention_color ; YES - blink in yellow + bsf win_invert ; set invert flag +TFT_active_gas_divemode2: WIN_STD dm_active_gas_column, dm_active_gas_row movff char_I_O2_ratio,lo ; lo now stores O2 in % movff char_I_He_ratio,hi ; hi now stores He in % - rcall TFT_active_gas_divemode2 ; Show gas (Non-Inverted in all cases) - bcf win_invert ; Reset invert flag + call customview_show_mix ; put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 + STRCAT_PRINT "" + bcf win_invert ; reset invert flag + goto TFT_standard_color ; ...and return + +TFT_active_setpoint: ; Show setpoint + btfsc is_bailout ; are we in bailout? + bra TFT_active_setpoint_bail ; YES - show "Bailout" instead of setpoint + movff int_O_breathed_ppO2+0,lo + movff int_O_breathed_ppO2+1,hi + TFT_color_code warn_ppo2 ; with ppO2 [cbar] in hi:lo + btg blinking_setpoint ; toggle blink bit... + btfss blinking_setpoint ; blink now? + bra TFT_active_setpoint_print ; NO - print ppO2 with normal rendering + btfsc setpoint_fallback ; YES - check if we are in fallback condition + bra TFT_active_setpoint_fallb ; YES - process fallback case + movff int_O_breathed_ppO2+1,WREG ; NO - get flags again (have been cleared in hi:lo by TFT_color_code meanwhile) + btfss WREG,int_warning_flag ; warning flag set? + bra TFT_active_setpoint_print ; NO - ppO2 is ok, print ppO2 with normal rendering + bra TFT_active_setpoint_com ; YES - continue with blinking common part +TFT_active_setpoint_fallb: ; set up fallback case + movlw color_yellow ; text in yellow + call TFT_set_color ; overwrite setting done by TFT_color_code warn_ppo2 +TFT_active_setpoint_com: ; blinking common part + bsf win_invert ; set invert flag +TFT_active_setpoint_print: + WIN_STD dm_active_gas_column, dm_active_gas_row + bsf leftbind + output_16dp .3 ; x.xx bar + bcf leftbind + STRCAT_TEXT tbar + movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP + sublw .1 ; opt_ccr_mode = 1 (Sensor)? + bnz TFT_active_setpoint2_a ; NO - skip + PUTC "*" ; YES - add an astrix +TFT_active_setpoint2_a: + STRCAT_PRINT "" + bcf win_invert ; reset invert flag + call TFT_standard_color ; revert to standard color + bra TFT_active_setpoint_diluent ; continue with showing diluent +TFT_active_setpoint_bail: + WIN_SMALL dm_active_gas_column, dm_active_gas_row+.3 ; collides with diluent in FT_MEDIUM call TFT_standard_color - return ; Done. - -TFT_active_gas_divemode2: - call customview_show_mix ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 + STRCPY_TEXT_PRINT tDiveBailout ; Bailout +TFT_active_setpoint_diluent: + btfss better_gas_available ; check if a better gas is available and a gas change is advised in divemode + bra TFT_active_setpoint_diluent_show ; NO - print in normal rendering + btg blinking_better_gas ; YES - toggle blink bit... + btfss blinking_better_gas ; blink now? + bra TFT_active_setpoint_diluent_show ; NO - print in normal rendering + movlw color_yellow ; YES - blink in yellow + call TFT_set_color ; set text color + bsf win_invert ; set invert flag +TFT_active_setpoint_diluent_show: + WIN_SMALL dm_active_dil_column, dm_active_dil_row + movff char_I_O2_ratio,lo ; lo now stores O2 in % + movff char_I_He_ratio,hi ; hi now stores He in % + call customview_show_mix ; put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 STRCAT_PRINT "" + bcf win_invert ; reset invert flag + goto TFT_standard_color ; ...and return + + + global TFT_show_mode_divemode +TFT_show_mode_divemode: + WIN_TINY dm_active_dil_column+.45, dm_active_dil_row+.3 + btfsc is_bailout ; in bailout? + return ; YES + btfsc FLAG_ccr_mode ; NO - in CCR mode? + bra TFT_show_mode_divemode_ccr ; YES - write CCR label + btfsc FLAG_pscr_mode ; NO - in pSCR mode? + bra TFT_show_mode_divemode_pscr ; YES - write pSCR label + return ; NO - done +TFT_show_mode_divemode_ccr: + call TFT_standard_color ; set standard color + STRCPY_TEXT_PRINT tDvCCR ; print "CCR" + return ; done +TFT_show_mode_divemode_pscr: + call TFT_standard_color ; set standard color + STRCPY_TEXT_PRINT tDvPSCR ; print "PSCR" return + global TFT_display_decotype_surface TFT_display_decotype_surface: WIN_STD surf_decotype_column,surf_decotype_row WIN_COLOR color_lightblue - movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR + movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR tstfsz lo bra TFT_display_decotype_surface2 TFT_display_decotype_surface0: - STRCAT_TEXT_PRINT tDvOC ; OC + STRCAT_TEXT_PRINT tDvOC ; OC bra TFT_display_decotype_exit TFT_display_decotype_surface2: decfsz lo,F bra TFT_display_decotype_surface3 - STRCAT_TEXT_PRINT tDvCC ; CC + STRCAT_TEXT_PRINT tDvCC ; CC call TFT_standard_color WIN_TINY surf_decotype_column+.18,surf_decotype_row+.12 - - TSTOSS opt_ccr_mode ; =0: Fixed SP, =1: Sensor, =2: Auto SP + TSTOSS opt_ccr_mode ; =0: Fixed SP, =1: Sensor, =2: Auto SP bra TFT_display_decotype_cc_fixed ; Sensor mode or Auto movff opt_ccr_mode,WREG sublw .2 bz TFT_display_decotype_cc_auto - STRCPY_TEXT tCCRModeSensor ; Sensor + STRCPY_TEXT tCCRModeSensor ; Sensor bra TFT_display_decotype_cc_common TFT_display_decotype_cc_auto: - STRCPY_TEXT tCCRModeAutoSP ; Auto SP + STRCPY_TEXT tCCRModeAutoSP ; Auto SP bra TFT_display_decotype_cc_common TFT_display_decotype_cc_fixed: - STRCPY_TEXT tCCRModeFixedSP ; Fixed SP + STRCPY_TEXT tCCRModeFixedSP ; Fixed SP TFT_display_decotype_cc_common: + clrf WREG + movff WREG,buffer+.8 ; limit string length to 8 STRCAT_PRINT "" bra TFT_display_decotype_exit - TFT_display_decotype_surface3: decfsz lo,F bra TFT_display_decotype_surface4 TFT_display_decotype_surface3_1: - STRCAT_TEXT_PRINT tDvGauge ; Gauge + STRCAT_TEXT_PRINT tDvGauge ; Gauge bra TFT_display_decotype_exit TFT_display_decotype_surface4: decfsz lo,F bra TFT_display_decotype_surface5 TFT_display_decotype_surface4_1: - STRCAT_TEXT_PRINT tDvApnea ; Apnea + STRCAT_TEXT_PRINT tDvApnea ; Apnea bra TFT_display_decotype_exit TFT_display_decotype_surface5: - STRCAT_TEXT_PRINT tDvPSCR ; PSCR + STRCAT_TEXT_PRINT tDvPSCR ; PSCR TFT_display_decotype_exit: - goto TFT_standard_color ; and return... + goto TFT_standard_color ; and return... + global TFT_display_decotype_surface1 ; Used from logbook! -TFT_display_decotype_surface1: ; Used from logbook! +TFT_display_decotype_surface1: ; Used from logbook! tstfsz lo bra TFT_display_decotype_surface1_2 bra TFT_display_decotype_surface0 ;OC @@ -2124,10 +2136,10 @@ ;============================================================================= - global TFT_splist_surfmode ; Show Setpoint list + global TFT_splist_surfmode ; Show Setpoint list extern gaslist_strcat_setpoint TFT_splist_surfmode: - bsf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint + bsf short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint ;SP 1 WIN_SMALL surf_gaslist_column,surf_gaslist_row clrf PRODL @@ -2208,17 +2220,18 @@ global TFT_depth TFT_depth: + bcf FLAG_TFT_depth SAFE_2BYTE_COPY rel_pressure, lo - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - - TFT_color_code warn_depth ; Color-code the output - call TFT_depth_blink + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + + TFT_color_code warn_depth ; Color-code the output + rcall TFT_depth_blink WIN_LARGE dm_depth_column, dm_depth_row TSTOSS opt_units ; 0=m, 1=ft bra TFT_depth_metric ;TFT_depth_imperial - clrf sub_a+1 ; Display 0ft if lower then 30cm + clrf sub_a+1 ; Display 0ft if lower then 30cm movlw d'30' movwf sub_a+0 movff hi,sub_b+1 @@ -2239,7 +2252,7 @@ depth_less_0.3mtr_feet: STRCAT_PRINT "0 " ; manual zero - bcf win_invert ; Reset invert flag + bcf win_invert ; Reset invert flag return TFT_depth_metric: @@ -2247,9 +2260,9 @@ cpfslt hi bra depth_greater_99_84mtr - btfsc depth_greater_100m ; Was depth>100m during last call - rcall TFT_clear_depth ; Yes, clear depth area - bcf depth_greater_100m ; Do this once only... + btfsc depth_greater_100m ; Was depth>100m during last call + rcall TFT_clear_depth ; Yes, clear depth area + bcf depth_greater_100m ; Do this once only... movlw .039 cpfslt hi @@ -2292,11 +2305,13 @@ ; .1m in MEDIUM font WIN_MEDIUM dm_depth_dm_column, dm_depth_dm_row - TFT_color_code warn_depth ; Color-code the output - + + ; TODO - check if needed, depth should still be in hi:lo SAFE_2BYTE_COPY rel_pressure, lo - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + + TFT_color_code warn_depth ; Color-code the output + PUTC "." movlw HIGH d'30' ; Display 0.0m if lower then 30cm movwf sub_a+1 @@ -2313,30 +2328,30 @@ bsf ignore_digit5 output_16dp d'0' STRCAT_PRINT "" ; Display decimeters - bcf win_invert ; Reset invert flag + bcf win_invert ; Reset invert flag WIN_FONT FT_SMALL return depth_less_0.3mtr: STRCAT_PRINT "0" ; Display 0.0m manually - bcf win_invert ; Reset invert flag + bcf win_invert ; Reset invert flag WIN_FONT FT_SMALL return -depth_greater_99_84mtr: ; Display only in full meters +depth_greater_99_84mtr: ; Display only in full meters btfss depth_greater_100m ; Is depth>100m already? rcall TFT_clear_depth ; No, clear depth area and set flag TFT_color_code warn_depth ; Depth is already in hi:lo ; Show depth in Full meters - ; That means ignore figure 4 and 5 + ; That means ignore digit 4 and 5 lfsr FSR2,buffer bsf ignore_digit4 bsf leftbind output_16 bcf leftbind STRCAT_PRINT "" ; Display full meters only - bcf win_invert ; Reset invert flag + bcf win_invert ; Reset invert flag WIN_FONT FT_SMALL return @@ -2346,7 +2361,7 @@ return TFT_depth_blink: - TSTOSS opt_modwarning ; 0=standard, 1=blink + TSTOSS opt_modwarning ; 0=standard, 1=blink return ; check if previous cycle had the blinking warning or not @@ -2373,13 +2388,13 @@ bsf blinking_depth_prev ; set prev flag ; and set toggle and invert if required btfss blinking_depth_toggle ; do we have the toggle set? - bra TFT_depth_blink_set ; No: set inverse, do color_box, set flag - bra TFT_depth_blink_reset ; Yes: clear inverse, do black box, reset flag + bra TFT_depth_blink_set ; No: set inverse, do color_box, set flag + bra TFT_depth_blink_reset ; Yes: clear inverse, do black box, reset flag TFT_depth_blink_prevwarn_nowarn: ; we had warning, but not now... (e.g. ascended or switched to better gas) ; reset the previous cycle flag for the next cycle... - bcf blinking_depth_prev ; reset prev flag + bcf blinking_depth_prev ; reset prev flag ; clear it - just in case if we had a blinked before bra TFT_depth_blink_reset ; Yes: clear inverse, do black box, reset flag @@ -2416,7 +2431,7 @@ ;============================================================================= global TFT_custom_text -TFT_custom_text: ; Show the custom text +TFT_custom_text: ; Show the custom text lfsr FSR0, opt_name ; Source WIN_SMALL surf_customtext_column,surf_customtext_row1 ; First row rcall TFT_custom_text_2 ; Show up to 12 chars and print @@ -2439,8 +2454,8 @@ return ; No, all done. lfsr FSR0, opt_name+.48 ; Source WIN_SMALL surf_customtext_column,surf_customtext_row5 ; Fifth row - bra TFT_custom_text_2 ; Show up to 12 chars and print ; and return... - + bra TFT_custom_text_2 ; Show up to 12 chars and print ; and return... + TFT_custom_text_2: lfsr FSR2, buffer ; destination @@ -2459,6 +2474,7 @@ ;============================================================================= + global TFT_update_surf_press TFT_update_surf_press: WIN_SMALL surf_press_column,surf_press_row @@ -2468,21 +2484,21 @@ movff hi,sub_a+1 movff last_surfpressure_30min+0,sub_b+0 movff last_surfpressure_30min+1,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b - btfsc neg_flag ; Pressure lower? - rcall update_surf_press2 ; Yes, test threshold - - tstfsz sub_c+1 ; >255mbar difference? - bra update_surf_press_common; Yes, display! - movlw d'10' ; 10mbar noise suppression + call subU16 ; sub_c = sub_a - sub_b + btfsc neg_flag ; Pressure lower? + rcall update_surf_press2 ; Yes, test threshold + tstfsz sub_c+1 ; >255mbar difference? + bra update_surf_press_common ; Yes, display! + movlw d'11' ; 10mbar noise suppression subwf sub_c+0,W btfsc STATUS,C - bra update_surf_press_common; Yes, display! + bra update_surf_press_common ; Yes, display! SAFE_2BYTE_COPY last_surfpressure_30min, lo ; Overwrite with stable value... - update_surf_press_common: + movff lo,int_I_pres_surface+0 ; copy displayed value to C code to have pressure displayed + movff hi,int_I_pres_surface+1 ; and pressure used for desaturation & no-fly time in sync output_16 - ; Show only 4 figures + ; Show only 4 digits movff buffer+1,buffer+0 movff buffer+2,buffer+1 movff buffer+3,buffer+2 @@ -2492,7 +2508,7 @@ STRCAT_PRINT "" call TFT_divemask_color WIN_SMALL surf_press_column+4*8,surf_press_row - STRCPY_TEXT_PRINT tMBAR ; mbar + STRCPY_TEXT_PRINT tMBAR ; mbar return update_surf_press2: @@ -2500,16 +2516,14 @@ movff hi,sub_b+1 movff last_surfpressure_30min+0,sub_a+0 movff last_surfpressure_30min+1,sub_a+1 - goto subU16 ; sub_c = sub_a - sub_b ; and return... - + goto subU16 ; sub_c = sub_a - sub_b ; and return... ;============================================================================= global TFT_update_batt_voltage TFT_update_batt_voltage: movff batt_percent,lo ; Get battery percent - TFT_color_code warn_battery; Color-code battery percent - + TFT_color_code warn_battery ; Color-code battery percent ; Setup charge indicator btfsc cc_active bsf win_invert @@ -2519,7 +2533,6 @@ movlw color_green btfsc cc_active call TFT_set_color - WIN_TINY batt_percent_column,batt_percent_row bsf leftbind output_8 @@ -2531,11 +2544,11 @@ bcf win_invert call TFT_standard_color WIN_TINY batt_voltage_column,batt_voltage_row - movff battery_type,lo ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah + movff battery_type,lo ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah PUTC "T" bsf leftbind - output_8 - PUTC ":" + output_8 + PUTC ":" movff batt_voltage+0,lo movff batt_voltage+1,hi output_16dp .2 @@ -2677,40 +2690,76 @@ global TFT_date TFT_date: - WIN_SMALL surf_date_column,surf_date_row ; Init new Wordprocessor + WIN_SMALL surf_date_column,surf_date_row ; Init new Wordprocessor call TFT_standard_color movff month,convert_value_temp+0 movff day,convert_value_temp+1 movff year,convert_value_temp+2 - call TFT_convert_date ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2 + call TFT_convert_date ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2 STRCAT_PRINT "" return ;============================================================================= - global TFT_max_pressure -TFT_max_pressure: - btfsc FLAG_apnoe_mode ; different display in apnoe mode - bra TFT_max_pressure_apnoe -TFT_max_pressure2: + global TFT_max_depth_alternative +TFT_max_depth_alternative: + bcf FLAG_TFT_max_depth_alt + ; The "mask" + call TFT_divemask_color + WIN_TINY dm_mask_depth_column, dm_max_alt_row-.14 + STRCPY_TEXT_PRINT tMaxDepth + + ; The max. depth + SAFE_2BYTE_COPY max_pressure, lo + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + call TFT_standard_color + TSTOSS opt_units ; 0=m, 1=ft + bra TFT_max_depth_alt_metric +;TFT_max_depth_alt_imperial: +TFT_max_depth_alt_metric: + WIN_LARGE dm_max_alt_column,dm_max_alt_row + bsf ignore_digit4 ; no 0.1m + output_16 + STRCAT_PRINT "" + + WIN_MEDIUM dm_max_dm_alt_column,dm_max_alt_row+.25 + SAFE_2BYTE_COPY max_pressure, lo + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + PUTC "." + movlw d'4' + movwf ignore_digits + bsf ignore_digit5 + bsf leftbind + output_16dp d'0' + STRCAT_PRINT "" ; Display decimeters + bcf leftbind + return + + + global TFT_max_depth +TFT_max_depth: + bcf FLAG_TFT_max_depth + btfsc FLAG_apnoe_mode ; different display in apnoe mode + bra TFT_max_depth_apnoe +TFT_max_depth2: SAFE_2BYTE_COPY max_pressure, lo -TFT_max_pressure3: - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - TSTOSS opt_units ; 0=m, 1=ft - bra TFT_max_pressure2_metric -;TFT_max_pressure2_imperial - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet +TFT_max_depth3: + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + TSTOSS opt_units ; 0=m, 1=ft + bra TFT_max_depth2_metric +;TFT_max_depth2_imperial: + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet WIN_MEDIUM dm_max_depth_column, dm_max_depth_row - TSTOSS opt_vsigraph ; 0=skip, 1=draw + TSTOSS opt_vsigraph ; 0=skip, 1=draw WIN_MEDIUM dm_max_depth_column_nvsi, dm_max_depth_row call TFT_standard_color output_16_3 STRCAT_PRINT "" return -TFT_max_pressure2_metric: +TFT_max_depth2_metric: WIN_MEDIUM dm_max_depth_column, dm_max_depth_row - TSTOSS opt_vsigraph ; 0=skip, 1=draw + TSTOSS opt_vsigraph ; 0=skip, 1=draw WIN_MEDIUM dm_max_depth_column_nvsi, dm_max_depth_row call TFT_standard_color @@ -2718,9 +2767,9 @@ cpfslt hi bra max_depth_greater_99_84mtr - btfsc max_depth_greater_100m ; Was depth>100m during last call - rcall TFT_clear_max_depth ; Yes, clear depth area - bcf max_depth_greater_100m ; Do this once only... + btfsc max_depth_greater_100m ; Was depth>100m during last call + rcall TFT_clear_max_depth ; Yes, clear depth area + bcf max_depth_greater_100m ; Do this once only... movlw .039 cpfslt hi @@ -2771,7 +2820,7 @@ WIN_SMALL dm_max_depth_dm_column_nvsi, dm_max_depth_dm_row SAFE_2BYTE_COPY max_pressure, lo - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] PUTC "." @@ -2780,7 +2829,7 @@ bsf ignore_digit5 bsf leftbind output_16dp d'0' - STRCAT_PRINT "" ; Display decimeters + STRCAT_PRINT "" ; Display decimeters bcf leftbind return @@ -2795,21 +2844,21 @@ bsf leftbind output_16 bcf leftbind - STRCAT_PRINT "" ; Display full meters only + STRCAT_PRINT "" ; Display full meters only WIN_FONT FT_SMALL return -TFT_clear_max_depth: ; No, clear max. depth area and set flag +TFT_clear_max_depth: ; No, clear max. depth area and set flag WIN_BOX_BLACK dm_max_depth_row, dm_max_depth_bot, dm_max_depth_column, dm_max_depth_rgt ;top, bottom, left, right - bsf max_depth_greater_100m ; Set Flag + bsf max_depth_greater_100m ; Set Flag return -TFT_max_pressure_apnoe: - btfss FLAG_active_descent ; Are we descending? - bra TFT_max_pressure2 ; Yes, show normal max. +TFT_max_depth_apnoe: + btfss FLAG_active_descent ; Are we descending? + bra TFT_max_depth2 ; Yes, show normal max. SAFE_2BYTE_COPY apnoe_max_pressure, lo - bra TFT_max_pressure3 ; Show apnoe_max_pressure as max. depth + bra TFT_max_depth3 ; Show apnoe_max_pressure as max. depth global TFT_display_apnoe_last_max TFT_display_apnoe_last_max: @@ -2819,11 +2868,11 @@ call TFT_standard_color SAFE_2BYTE_COPY max_pressure, lo - call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] - TSTOSS opt_units ; 0=m, 1=ft + call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] + TSTOSS opt_units ; 0=m, 1=ft bra TFT_display_apnoe_last_m_metric ;TFT_display_apnoe_last_max_imperial - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet WIN_MEDIUM dm_apnoe_last_max_depth_column, dm_apnoe_last_max_depth_row output_16 STRCAT_PRINT "" @@ -2837,22 +2886,23 @@ return ;============================================================================= + global TFT_divemins TFT_divemins: + bcf FLAG_TFT_divemins ; Clear flag movff divemins+0,lo movff divemins+1,hi - ; Already showing divemins > 99min - btfsc no_more_divesecs ; Ignore seconds? + btfsc no_more_divesecs ; Ignore seconds? bra TFT_divemins2 ; Show minutes only tstfsz hi ; hi = 0? - bra TFT_divemins_clr ; No, show mins only + bra TFT_divemins_clr ; No, show mins only movlw .99 cpfsgt lo ; bigger than 99? - bra TFT_divemins1 ; No show mins:secs + bra TFT_divemins1 ; No show mins:secs TFT_divemins_clr: ; Yes, remove second display for the rest of the dive and clear seconds @@ -2865,9 +2915,7 @@ ; Print out the minutes, up to 99min, only 2chars ! call TFT_standard_color WIN_MEDIUM dm_divetime_column, dm_divetime_row - bcf leftbind output_99 ; displays only last two figures from a 8Bit value (0-99) - bcf leftbind STRCAT_PRINT "" ; Show minutes in large font ; Print out the seconds @@ -2875,7 +2923,7 @@ PUTC ':' bsf leftbind movff divesecs,lo - output_99x ; displays only last two figures from a 8Bit value with leading zero (00-99) + output_99x ; displays only last two figures from a 8Bit value with leading zero (00-99) bcf leftbind STRCAT_PRINT "" ; Show seconds in small font return @@ -2886,10 +2934,31 @@ WIN_MEDIUM dm_divetime_minsonly_column, dm_divetime_row bcf leftbind output_16_4 - STRCAT_PRINT "" ; Show minutes in large font + STRCAT_PRINT "" ; Show minutes in large font return + + global TFT_divemins_alternative +TFT_divemins_alternative: + bcf FLAG_TFT_divemins ; Clear flag + call TFT_standard_color + ; Print out the minutes (0-999) in large + WIN_LARGE dm_divetime_alt_column, dm_divetime_alt_row + movff divemins+0,lo + movff divemins+1,hi + output_16_3 ; limit to 999 and display only (0-999) + STRCAT_PRINT "" ; Show minutes + ; Print out the seconds in medium + WIN_MEDIUM dm_divetime_alt_column+.60, dm_divetime_alt_row+.25 + PUTC ":" + bsf leftbind + movff divesecs,lo + output_99x ; displays only last two figures from a 8Bit value with leading zero (00-99) + bcf leftbind + STRCAT_PRINT "" ; Show seconds in small font + return ;============================================================================= + global TFT_display_apnoe_surface TFT_display_apnoe_surface: call TFT_divemask_color @@ -2909,18 +2978,18 @@ global TFT_apnoe_clear_surface TFT_apnoe_clear_surface: ; Clear Surface timer.... - WIN_BOX_BLACK dm_apnoe_surface_time_text_row, .239, dm_apnoe_surface_time_text_col, .159 ;top, bottom, left, right + WIN_BOX_BLACK dm_apnoe_surface_time_text_row, .239, dm_apnoe_surface_time_text_col, .159 ;top, bottom, left, right return global TFT_display_apnoe_descent -TFT_display_apnoe_descent: ; Descent divetime +TFT_display_apnoe_descent: ; Descent divetime movff apnoe_mins,lo clrf hi WIN_MEDIUM dm_divetime_apnoe_column, dm_divetime_apnoe_row output_16_3 ; displays only last three figures from a 16Bit value (0-999) call TFT_standard_color STRCAT_PRINT "" ; Show minutes in large font - WIN_SMALL dm_divetime_apnoe_secs_column, dm_divetime_apnoe_secs_row ; left position for two sec figures + WIN_SMALL dm_divetime_apnoe_secs_column, dm_divetime_apnoe_secs_row ; left position for two sec figures PUTC ':' bsf leftbind movff apnoe_secs,lo @@ -2949,11 +3018,11 @@ ;============================================================================= ; Writes ostc #Serial and Firmware version in splash screen -; + global TFT_serial TFT_serial: WIN_TINY .5,.225 - STRCPY "OSTC" ; Won't translate that... + STRCPY "OSTC" ; Won't translate that... movlw 0x0A cpfseq hardware_flag @@ -3002,15 +3071,14 @@ WIN_LEFT .160-4*9/2 ; Right pad. STRCPY_TEXT_PRINT tBeta endif - call TFT_standard_color + call TFT_standard_color bcf win_invert return - - ;============================================================================= ; For the Information menu: append firmware x.yy version. + global info_menu_firmware extern tFirmware info_menu_firmware: @@ -3055,6 +3123,7 @@ ;----------------------------------------------------------------------------- ; For the Information menu: append serial number + global info_menu_serial extern tSerial info_menu_serial: @@ -3077,6 +3146,7 @@ ;----------------------------------------------------------------------------- ; For the Information menu: Append total dives + global info_menu_total_dives extern tTotalDives info_menu_total_dives: @@ -3101,8 +3171,8 @@ movff batt_voltage+1,hi movff batt_voltage+0,lo bsf leftbind - output_16dp .2 ; x.xxx - STRCAT "V (T" + output_16dp .2 ; x.xxx + STRCAT "V(T" movff battery_type,lo ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah output_8 bcf leftbind @@ -3122,15 +3192,15 @@ movlw LOW .3600 movwf xB+0 movlw HIGH .3600 - movwf xB+1 ; One day = 3600s - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + movwf xB+1 ; One day = 3600s + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder ;xC+0:xC+1 -> Full hours movff xC+1,xA+1 movff xC+0,xA+0 clrf xB+1 movlw .24 movwf xB+0 - call div16x16 ;xA/xB=xC with xA+0 as remainder + call div16x16 ; xA/xB=xC with xA+0 as remainder movff xC+0,lo movff xC+1,hi ; Full days bsf leftbind @@ -3182,49 +3252,61 @@ ;----------------------------------------------------------------------------- ; ppO2 menu + global divesets_ppo2_max extern tPPO2Max extern tbar divesets_ppo2_max: lfsr FSR1,tPPO2Max call strcat_text - movff opt_ppO2_max,lo + movff char_I_ppO2_max,lo movlw ppo2_warning_high + divesets_ppo2_common: - movwf up ; Save default value + movwf up ; Save default value clrf hi bsf leftbind output_16dp d'3' bcf leftbind lfsr FSR1,tbar call strcat_text - - movf up,W ; Default value - cpfseq lo ; Current value - bra divesets_ppo2_common2 ; Not default, add * - return ; Default, Done. + movf up,W ; Default value + cpfseq lo ; Current value + bra divesets_ppo2_common2 ; Not default, add * + return ; Default, Done. divesets_ppo2_common2: PUTC "*" - return ; Done. + return ; Done. + global divesets_ppo2_min extern tPPO2MIN divesets_ppo2_min: lfsr FSR1,tPPO2MIN call strcat_text - movff opt_ppO2_min,lo + movff char_I_ppO2_min,lo movlw ppo2_warning_low bra divesets_ppo2_common + global divesets_ppo2_max_deco extern tPPO2DECO divesets_ppo2_max_deco: lfsr FSR1,tPPO2DECO call strcat_text - movff opt_ppO2_max_deco,lo + movff char_I_ppO2_max_deco,lo movlw ppo2_warning_high_deco bra divesets_ppo2_common - + + + global divesets_ppo2_min_cc + extern tPPO2MINCC +divesets_ppo2_min_cc: + lfsr FSR1,tPPO2MINCC + call strcat_text + movff char_I_ppO2_min_loop,lo + movlw ppo2_warning_low_cc + bra divesets_ppo2_common ;============================================================================= @@ -3232,202 +3314,340 @@ TFT_clear_warning_text: btfss divemode ; in divemode? bra TFT_clear_warning_text2 ; No, setup for surface mode - WIN_BOX_BLACK dm_warning_row, dm_warning_bot, dm_warning_column, dm_warning_rgt ;top, bottom, left, right + bcf FLAG_TFT_dive_warning_text_clear ; Clear flag + btfsc alternative_divelayout + bra TFT_clear_warning_text_2nd_row ; In Alt mode, clear only row 2 + WIN_BOX_BLACK dm_warning_row, dm_warning_bot, dm_warning_column, dm_warning_rgt ; top, bottom, left, right return TFT_clear_warning_text2: - WIN_BOX_BLACK surf_warning1_row, surf_warning2_row+.24, surf_warning1_column, surf_warning1_column+.76 ;top, bottom, left, right + WIN_BOX_BLACK surf_warning1_row, surf_warning2_row+.24, surf_warning1_column, surf_warning1_column+.76 ; top, bottom, left, right return global TFT_clear_warning_text_2nd_row TFT_clear_warning_text_2nd_row: btfss divemode ; in divemode? bra TFT_clear_warning_text_2nd_2 ; No, setup for surface mode - WIN_BOX_BLACK dm_warning2_row, dm_warning2_bot, dm_warning2_column, dm_warning2_rgt ;top, bottom, left, right + bcf FLAG_TFT_dive_warning_text_clr2 ; Clear flag + WIN_BOX_BLACK dm_warning2_row, dm_warning2_bot, dm_warning2_column, dm_warning2_rgt ; top, bottom, left, right return TFT_clear_warning_text_2nd_2: - WIN_BOX_BLACK surf_warning2_row, surf_warning2_row+.24, surf_warning2_column, surf_warning2_column+.76 ;top, bottom, left, right + WIN_BOX_BLACK surf_warning2_row, surf_warning2_row+.24, surf_warning2_column, surf_warning2_column+.76 ; top, bottom, left, right return global TFT_fillup_with_spaces -TFT_fillup_with_spaces: ; Fillup FSR2 with spaces (Total string length in #WREG) - movwf lo ; save max. string length into lo - movf FSR2L,W ; Get current string length - subwf lo,F ; lo-WREG - btfsc STATUS,N ; longer then #lo already? - return ; Yes, done. - tstfsz lo ; Zero? +TFT_fillup_with_spaces: ; Fillup FSR2 with spaces (Total string length in #WREG) + movwf lo ; save max. string length into lo + movf FSR2L,W ; Get current string length + subwf lo,F ; lo-WREG + btfsc STATUS,N ; longer then #lo already? + return ; Yes, done. + tstfsz lo ; Zero? bra TFT_fillup_with_spaces2 ; No. - return ; Yes, done. + return ; Yes, done. TFT_fillup_with_spaces2: - PUTC " " ; Add one space - decfsz lo,F ; All done? + PUTC " " ; Add one space + decfsz lo,F ; All done? bra TFT_fillup_with_spaces2 ; No, loop - return ; Done. - + return ; Done. + +;============================================================================= + global TFT_desaturation_time TFT_desaturation_time: rcall TFT_warning_set_window ; Sets the row and column for the current warning tstfsz WREG ; Is there room for the warning? return ; No - call TFT_warning_set_window_com STRCPY "Desat:" - movff desaturation_time+0,lo ; divide by 60... - movff desaturation_time+1,hi - call convert_time ; converts hi:lo in minutes to hours (hi) and minutes (lo) - bsf leftbind - movf lo,W - movff hi,lo - movwf hi ; exchange lo and hi... - output_8 ; Hours - PUTC ':' - movff hi,lo ; Minutes + movff int_O_desaturation_time+0,lo + movff int_O_desaturation_time+1,hi + call convert_time ; converts hi:lo in minutes to hours (hi) and minutes (lo) + bsf leftbind + movf lo,W + movff hi,lo + movwf hi ; exchange lo and hi... + output_8 ; Hours + PUTC ':' + movff hi,lo ; Minutes output_99x bcf leftbind - movlw surf_warning_length ; Only use surface string length - rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - movlw .0 - movff WREG,buffer+11 - STRCAT_PRINT "" + movlw surf_warning_length ; Only use surface string length + rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + movlw .0 ; TODO - needed? + movff WREG,buffer+11 ; TODO - needed? + STRCAT_PRINT "" bcf win_invert return + global TFT_nofly_time TFT_nofly_time: rcall TFT_warning_set_window ; Sets the row and column for the current warning tstfsz WREG ; Is there room for the warning? return ; No - call TFT_warning_set_window_com + movff char_I_altitude_wait,WREG + tstfsz WREG + bra TFT_nofly_time_1 STRCPY "NoFly:" - movff nofly_time+0,lo ; divide by 60... - movff nofly_time+1,hi - call convert_time ; converts hi:lo in minutes to hours (hi) and minutes (lo) - bsf leftbind - movf lo,W - movff hi,lo - movwf hi ; exchange lo and hi... - output_8 ; Hours - PUTC ':' - movff hi,lo ; Minutes + bra TFT_nofly_time_2 +TFT_nofly_time_1: + STRCPY "NoAlt:" +TFT_nofly_time_2: + movff int_O_nofly_time+0,lo + movff int_O_nofly_time+1,hi + call convert_time ; converts hi:lo in minutes to hours (hi) and minutes (lo) + bsf leftbind + movf lo,W + movff hi,lo + movwf hi ; exchange lo and hi... + output_8 ; Hours + PUTC ':' + movff hi,lo ; Minutes output_99x bcf leftbind - movlw surf_warning_length ; Only use surface string length - rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - movlw .0 - movff WREG,buffer+11 + movlw surf_warning_length ; Only use surface string length + rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + movlw .0 ; TODO - needed? + movff WREG,buffer+11 ; TODO - needed? STRCAT_PRINT "" bcf win_invert return +;============================================================================= + global TFT_warning_agf TFT_warning_agf: rcall TFT_warning_set_window ; Sets the row and column for the current warning tstfsz WREG ; Is there room for the warning? return ; No - call TFT_warning_set_window_com call TFT_warnings_color STRCPY_TEXT tDiveaGF_active ; "aGF!" - movlw dm_warning_length ; Divemode string length + movlw dm_warning_length ; Divemode string length rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) STRCAT_PRINT "" - call TFT_standard_color - bcf win_invert - return + ;bcf win_invert + ;return + goto TFT_standard_color global TFT_warning_fallback -TFT_warning_fallback: ; Show fallback warning +TFT_warning_fallback: ; Show fallback warning + rcall TFT_warning_set_window ; Sets the row and column for the current warning + tstfsz WREG ; Is there room for the warning? + return ; No + call TFT_warnings_color + STRCPY_TEXT tDiveFallback ; "Fallback!" + movlw dm_warning_length ; Divemode string length + rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + STRCAT_PRINT "" + goto TFT_standard_color ; and return... + + + global TFT_info_deco +TFT_info_deco ; show info when in decompression + rcall TFT_warning_set_window ; Sets the row and column for the current warning + tstfsz WREG ; Is there room for the warning? + return ; NO - return + movlw color_green ; YES - select green text color + call TFT_set_color ; set color + STRCPY_TEXT tDecoInfo ; write "Deco Zone" + movlw dm_warning_length ; select Divemode string length + rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + STRCAT_PRINT "" ; print buffer + goto TFT_standard_color ; and return... + + + global TFT_warning_gf +TFT_warning_gf: ; GF + rcall TFT_warning_set_window ; Sets the row and column for the current warning + tstfsz WREG ; Is there room for the warning? + return ; No + movff int_O_gradient_factor+0,lo ; bank-safe copy gradient factor + movff int_O_gradient_factor+1,hi ; + TFT_color_code warn_gf ; Color-code Output + STRCPY "GF: " ; the two spaces are on purpose to align the output with other warnings' outputs + bsf leftbind + output_8 ; print value of lo only, int_O_gradient_factor is limited to 255 + PUTC "%" + movlw dm_warning_length ; Divemode string length + btfss divemode ; In Divemode? + movlw surf_warning_length ; No, use surface string length + rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + STRCAT_PRINT "" + bcf leftbind + bcf win_invert + goto TFT_standard_color ; and return... + + + global TFT_warning_mbubbles +TFT_warning_mbubbles: + rcall TFT_warning_set_window ; sets the row and column for the current warning + tstfsz WREG ; Is there room for the warning? + return ; NO + call TFT_attention_color ; set attention color as default + movff char_O_deco_warnings,WREG ; bank-safe copy for deco warnings + btfsc WREG,mbubble_warning ; are we in the microbubbles zone right now? + call TFT_warnings_color ; YES - reconfigure to warning color + STRCPY_TEXT tMicroBubbles + movlw dm_warning_length ; divemode string length + btfss divemode ; in Divemode? + movlw surf_warning_length ; NO - use surface string length + rcall TFT_fillup_with_spaces ; fillup FSR2 with spaces (total string length in #WREG) + STRCAT_PRINT "" + goto TFT_standard_color ; and return... + + + global TFT_warning_outside +TFT_warning_outside: + rcall TFT_warning_set_window ; sets the row and column for the current warning + tstfsz WREG ; is there room for the warning? + return ; NO + call TFT_attention_color + movff char_O_deco_warnings,WREG ; bank-safe copy for deco warnings + btfsc WREG,outside_warning ; are we outside the ZH-L16 model right now? + call TFT_warnings_color ; YES - reconfigure to warning color + STRCPY "X-ZHL16-X" + movlw dm_warning_length ; divemode string length + btfss divemode ; in Divemode? + movlw surf_warning_length ; NO - use surface string length + rcall TFT_fillup_with_spaces ; fillup FSR2 with spaces (total string length in #WREG) + STRCAT_PRINT "" + goto TFT_standard_color ; and return... + + + global TFT_warning_gas_needs_warn + global TFT_warning_gas_needs_att +TFT_warning_gas_needs_warn: + rcall TFT_warning_gas_needs_war_helper + rcall TFT_warning_set_window ; Sets the row and column for the current warning + tstfsz WREG ; Is there room for the warning? + return ; No + call TFT_warnings_color + bra TFT_warning_gas_needs_com +TFT_warning_gas_needs_att: + rcall TFT_warning_gas_needs_att_helper + rcall TFT_warning_set_window ; Sets the row and column for the current warning + tstfsz WREG ; Is there room for the warning? + return ; No + call TFT_attention_color +TFT_warning_gas_needs_com: + STRCPY_TEXT tGasNeedsWarn ; "Gas Needs" + movlw dm_warning_length ; Divemode string length + rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + STRCAT_PRINT "" + goto TFT_standard_color ; and return... + +TFT_warning_gas_needs_war_helper: + incf warning_counter,F ; increase counter + btfsc gas_needs_warning ; is it a new warning? + return ; NO - do not show the gas needs custom view again + bsf gas_needs_warning ; YES - memorise it's an old now + bra TFT_warning_gas_needs_helper_com +TFT_warning_gas_needs_att_helper: + incf warning_counter,F ; increase counter + btfsc gas_needs_attention ; is it a new attention? + return ; NO - do not show the gas needs custom view again + bsf gas_needs_attention ; YES - memorise it's an old now +TFT_warning_gas_needs_helper_com: + movlw .12 ; customview number one below gas needs view + movwf menupos3 ; set fake current view number + bsf toggle_customview ; initiate toggle of customview -> gas needs view will be shown + return + + + global TFT_warning_IBCD +TFT_warning_IBCD: + rcall TFT_warning_set_window ; Sets the row and column for the current warning + tstfsz WREG ; Is there room for the warning? + return ; No + call TFT_attention_color ; select attention color as default + STRCPY_TEXT tIBCD ; "IBCD N2He" + movlw dm_warning_length ; Divemode string length + rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + STRCAT_PRINT "" + goto TFT_standard_color ; and return... + + + global TFT_warning_sensor_disagree +TFT_warning_sensor_disagree: ; Show sensor disagree warning + rcall TFT_warning_sensor_dis_helper rcall TFT_warning_set_window ; Sets the row and column for the current warning tstfsz WREG ; Is there room for the warning? return ; No call TFT_warnings_color - STRCPY_TEXT tDiveFallback ; "Fallback!" - movlw dm_warning_length ; Divemode string length + STRCPY_TEXT tSensorDisagree ; "Sensors<>" + movlw dm_warning_length ; Divemode string length rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) STRCAT_PRINT "" - goto TFT_standard_color ; and return... - - global TFT_warning_gf -TFT_warning_gf: ;GF - rcall TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; No - call TFT_warning_set_window_com - TFT_color_code warn_gf ; Color-code Output - STRCPY "GF:" - movff char_O_gradient_factor,lo ; gradient factor - bsf leftbind - output_8 - PUTC "%" - movlw dm_warning_length ; Divemode string length - btfss divemode ; In Divemode? - movlw surf_warning_length ; No, use surface string length - rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - STRCAT_PRINT "" - bcf leftbind - bcf win_invert - goto TFT_standard_color ; and return... - + goto TFT_standard_color ; and return... + +TFT_warning_sensor_dis_helper: + btfsc sensor_warning ; is it a new warning? + return ; NO - do not show the gas needs custom view again + bsf sensor_warning ; YES - memories it's an old warning now + clrf menupos3 ; set fake current view number + bsf toggle_customview ; initiate toggle of customview -> sensor view will be shown + return + +;============================================================================= + TFT_warning_set_window: ; Sets the row and column for the current warning ; ignore warning (now)? decf warning_counter,W ; -1 bcf STATUS,C + btfss alternative_divelayout ; In alt mode, do not divide... rrcf WREG,W ; (warning_counter-1)/2 cpfseq warning_page retlw .255 ; WREG <> 0 -> Warning window not defined - call TFT_standard_color - btfss divemode ; in divemode? bra TFT_warning_set_window3 ; No, setup for surface mode - + btfss alternative_divelayout + bra TFT_warning_set_window3a ; standard layout + bra TFT_warning_set_window2a ; alternative layout (Only lower row used) +TFT_warning_set_window3a: btfss warning_counter,0 ; Toggle with each warning - bra TFT_warning_set_window2 - WIN_SMALL dm_warning1_column, dm_warning1_row + bra TFT_warning_set_window2 + WIN_SMALL dm_warning1_column, dm_warning1_row bcf second_row_warning ; =1: The second row contains a warning - retlw .0 ; WREG=0 -> Warning window defined + retlw .0 ; WREG=0 -> Warning window defined TFT_warning_set_window2: - WIN_SMALL dm_warning2_column, dm_warning2_row bsf second_row_warning ; =1: The second row contains a warning - retlw .0 ; WREG=0 -> Warning window defined - +TFT_warning_set_window2a: + WIN_SMALL dm_warning2_column, dm_warning2_row + retlw .0 ; WREG=0 -> Warning window defined TFT_warning_set_window3: btfss warning_counter,0 ; Toggle with each warning - bra TFT_warning_set_window4 + bra TFT_warning_set_window4 WIN_SMALL surf_warning1_column,surf_warning1_row bcf second_row_warning ; =1: The second row contains a warning - retlw .0 ; WREG=0 -> Warning window defined + retlw .0 ; WREG=0 -> Warning window defined TFT_warning_set_window4: - WIN_SMALL surf_warning2_column,surf_warning2_row + WIN_SMALL surf_warning2_column,surf_warning2_row bsf second_row_warning ; =1: The second row contains a warning - retlw .0 ; WREG=0 -> Warning window defined - -TFT_warning_set_window_com: - if dm_offset == 0 - bsf win_invert - endif - return + retlw .0 ; WREG=0 -> Warning window defined + global TFT_update_batt_percent_divemode TFT_update_batt_percent_divemode: rcall TFT_warning_set_window ; Sets the row and column for the current warning tstfsz WREG ; Is there room for the warning? return ; No - call TFT_warning_set_window_com - movff batt_percent,lo ; Get battery percent - TFT_color_code warn_battery; Color-code battery percent + movff batt_percent,lo ; Get battery percent + TFT_color_code warn_battery ; Color-code battery percent STRCPY "Batt:" bsf leftbind output_8 bcf leftbind PUTC "%" - movlw dm_warning_length ; Divemode string length + movlw dm_warning_length ; Divemode string length btfss divemode ; In Divemode? movlw surf_warning_length ; No, use surface string length rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) STRCAT_PRINT "" bcf win_invert - goto TFT_standard_color ; and return... - - global TFT_gf_mask ; Setup Mask + goto TFT_standard_color ; and return... + + + global TFT_gf_mask ; Setup Mask TFT_gf_mask: ; The mask call TFT_divemask_color @@ -3437,12 +3657,10 @@ STRCPY_TEXT_PRINT taGFactors WIN_TINY dm_custom_gf_title_col3, dm_custom_gf_title_row STRCPY_TEXT_PRINT tGFInfo - ; Show GF (Static) call TFT_disabled_color btfss use_agf call TFT_standard_color - WIN_STD dm_custom_gf_column, dm_custom_gf_row bsf leftbind movff opt_GF_low,lo @@ -3455,10 +3673,8 @@ call TFT_standard_color TSTOSS opt_enable_aGF ; =1: aGF can be selected underwater bra TFT_gf_mask2 ; Show "---" instead - btfss use_agf call TFT_disabled_color - WIN_STD dm_custom_agf_column, dm_custom_agf_row movff opt_aGF_low,lo output_8 @@ -3475,59 +3691,60 @@ bcf leftbind return + global TFT_gf_mask_cGF ; Setup Mask TFT_gf_mask_cGF: ; The mask - call TFT_divemask_color - WIN_TINY dm_custom_gf_title_col3, dm_custom_gf_title_row + call TFT_divemask_color + WIN_TINY dm_custom_gf_title_col3, dm_custom_gf_title_row STRCPY_TEXT_PRINT tGFInfo - goto TFT_standard_color; and return... + goto TFT_standard_color; and return... global TFT_gf_info ; Show GF informations TFT_gf_info: - call TFT_standard_color - ; Show current GF - movff char_O_gradient_factor,lo ; gradient factor absolute (Non-GF model) - movff char_I_deco_model,hi WIN_STD dm_custom_currentgf_column, dm_custom_currentgf_row - output_8 + movff int_O_gradient_factor+0,lo ; gradient factor absolute (Non-GF model) + movff int_O_gradient_factor+1,hi + TFT_color_code warn_gf ; Color-code Output + output_8 ; print lo only, int_O_gradient_factor is limited to 255 STRCAT_PRINT "%" return + global TFT_battinfo_tissues_clock_mask ; Setup Mask TFT_battinfo_tissues_clock_mask: ; The mask ; Put three columns at HUD positions call TFT_divemask_color - btfsc FLAG_apnoe_mode ; In Apnoe mode? - bra TFT_battinfo_tissues_clock_mask2 ; Yes - btfsc FLAG_gauge_mode ; In Gauge mode? - bra TFT_battinfo_tissues_clock_mask2 ; Yes - WIN_TINY dm_custom_tissue_title_column, dm_custom_tissue_title_row + btfsc FLAG_apnoe_mode ; In Apnoe mode? + bra TFT_battinfo_tissues_clock_mask2 ; Yes + btfsc FLAG_gauge_mode ; In Gauge mode? + bra TFT_battinfo_tissues_clock_mask2 ; Yes + WIN_TINY dm_custom_tissue_title_column, dm_custom_tissue_title_row STRCPY_TEXT_PRINT tDiveTissues -TFT_battinfo_tissues_clock_mask2: ; Show only clock - WIN_TINY dm_custom_ead_column, dm_custom_eadend_title_row - STRCPY_TEXT_PRINT tBatteryV ; "Battery: " - WIN_TINY dm_custom_clock_column, dm_custom_clock_title_row +TFT_battinfo_tissues_clock_mask2: ; Show only clock + WIN_TINY dm_custom_ead_column, dm_custom_eadend_title_row + STRCPY_TEXT_PRINT tBatteryV ; "Battery: " + WIN_TINY dm_custom_clock_column, dm_custom_clock_title_row STRCPY_TEXT_PRINT tDiveClock - goto TFT_standard_color; and return... - - global TFT_battinfo_tissues_clock ; Show EAD/END, Tissues and clock + goto TFT_standard_color ; and return... + + global TFT_battinfo_tissues_clock ; Show EAD/END, Tissues and clock TFT_battinfo_tissues_clock: ; Update clock and date WIN_SMALL dm_custom_clock_column, dm_custom_clock_row - call TFT_clock2 ; print clock + call TFT_clock2 ; print clock ; Show Battery info WIN_SMALL dm_custom_ead_column, dm_custom_ead_row - movff batt_percent,lo ; Get battery percent - TFT_color_code warn_battery; Color-code battery percent + movff batt_percent,lo ; Get battery percent + TFT_color_code warn_battery ; Color-code battery percent bsf leftbind output_8 bcf leftbind STRCAT "% " movlw 0x00 - movff WREG,buffer+4 ; Only "xxx%" + movff WREG,buffer+4 ; Only "xxx%" STRCAT_PRINT "" bcf win_invert call TFT_standard_color @@ -3540,106 +3757,217 @@ PUTC 'V' movff buffer+5,buffer+4 movlw 0x00 - movff WREG,buffer+5 ; Only "x.yzV" + movff WREG,buffer+5 ; Only "x.yzV" STRCAT_PRINT "" - btfsc FLAG_apnoe_mode ; In Apnoe mode? - return ; Yes, done. - btfsc FLAG_gauge_mode ; In Gauge mode? - return ; Yes, done. + btfsc FLAG_apnoe_mode ; In Apnoe mode? + return ; Yes, done. + btfsc FLAG_gauge_mode ; In Gauge mode? + return ; Yes, done. ; Show tissue diagram call TFT_divemask_color - WIN_TINY dm_custom_tissue_N2_column, dm_custom_tissue_N2_row + WIN_TINY dm_custom_tissue_N2_column, dm_custom_tissue_N2_row STRCPY_TEXT_PRINT tN2 - WIN_TINY dm_custom_tissue_He_column, dm_custom_tissue_He_row + WIN_TINY dm_custom_tissue_He_column, dm_custom_tissue_He_row STRCPY_TEXT_PRINT tHe - call deco_calc_desaturation_time ; calculate desaturation time (and char_O_tissue_N2_saturation and char_O_tissue_He_saturation) - movlb b'00000001' ; select ram bank 1 - bra DISP_tissue_saturation_graph ; Show char_O_tissue_N2_saturation and char_O_tissue_He_saturation ; and return... + bra DISP_tissue_saturation_graph ; Show char_O_tissue_N2_saturation and char_O_tissue_He_saturation and return... global TFT_pscr_info_mask -TFT_pscr_info_mask: ; Show ppO2, drop and lung ratio mask +TFT_pscr_info_mask: ; Show pSCR-ppO2, drop and lung ratio mask rcall TFT_mask_ppo2 call TFT_divemask_color - WIN_TINY dm_custom_pscr_text_drop_column, dm_custom_pscr_text_row + WIN_TINY dm_custom_pscr_text_drop_column, dm_custom_pscr_text_row STRCPY_TEXT_PRINT tPSCR_O2_drop - WIN_TINY dm_custom_pscr_text_ratio_column, dm_custom_pscr_text_row + WIN_TINY dm_custom_pscr_text_ratio_column, dm_custom_pscr_text_row STRCPY_TEXT_PRINT tPSCR_lungratio - goto TFT_standard_color; and return... + goto TFT_standard_color ; and return... - global TFT_pscr_info ; Show ppO2, drop and lung ratio + global TFT_pscr_info ; Show pSCR-ppO2, drop and lung ratio TFT_pscr_info: ;show ppO2 - rcall TFT_display_ppo2_val + WIN_MEDIUM dm_custom_ceiling_ppo2_val_col, dm_custom_ceiling_value_row + movff int_O_pSCR_ppO2+0,lo ; copy pSCR ppO2 to hi:lo + movff int_O_pSCR_ppO2+1,hi + TFT_color_code warn_ppo2 ; color-code output + bsf leftbind + output_16dp .3 ; x.xx bar + bcf leftbind + STRCAT_PRINT "" ; Show Drop WIN_STD dm_custom_pscr_drop_column,dm_custom_pscr_drop_row - movff opt_PSCR_drop,lo + call TFT_standard_color + movff char_I_PSCR_drop,lo bsf leftbind output_8 STRCAT_PRINT "%" ; Show lung ratio WIN_STD dm_custom_pscr_ratio_column,dm_custom_pscr_ratio_row - movff opt_PSCR_lungratio,lo + movff char_I_PSCR_lungratio,lo bsf leftbind STRCPY "1/" output_8 STRCAT_PRINT "" bcf leftbind return - - - global TFT_ppo2_ead_end_cns_mask ; Show ppO2, END/EAD and CNS mask -TFT_ppo2_ead_end_cns_mask: - rcall TFT_mask_ppo2 + + + global TFT_gas_needs_mask +TFT_gas_needs_mask: + call TFT_divemask_color + WIN_TINY dm_custom_dyn_gas_mask_column-.10,dm_custom_dyn_gas_mask_row + STRCPY_TEXT_PRINT tGasNeedsBar ; "Gas Needs (bar)" + goto TFT_standard_color ; and return... + + global TFT_gas_needs +TFT_gas_needs: ; LIMITATION: there is only space for 4 gases on the screen - if 5 gases + bsf leftbind ; have a pres_need > 0, then only the first 4 will be shown! + clrf up + WIN_SMALL dm_custom_dyn_gas_column1+.5,dm_custom_dyn_gas_row1 + call TFT_gas_needs_helper + WIN_SMALL dm_custom_dyn_gas_column1+.5,dm_custom_dyn_gas_row2 + call TFT_gas_needs_helper + WIN_SMALL dm_custom_dyn_gas_column2+.5,dm_custom_dyn_gas_row1 + call TFT_gas_needs_helper + WIN_SMALL dm_custom_dyn_gas_column2+.5,dm_custom_dyn_gas_row2 + call TFT_gas_needs_helper + bcf leftbind + return + +TFT_gas_needs_helper: + call TFT_standard_color + movlw .5 ; number of gases + cpfslt up ; check if all gases have been processed + bra TFT_gas_needs_helper_1 ; yes -> clear display area + movf up,W ; no -> get gas number and check if need of that gas is > 0 + rlncf WREG,W ; multipy by 2 + lfsr FSR1,int_O_tank_pres_need+1 ; read HIGH(int_O_tank_pres_need[up]) + movff PLUSW1,hi ; copy to temp storage hi + btfss hi,int_is_zero ; check flag for pres_need == 0 + bra TFT_gas_needs_helper_2 ; no -> print gas type and pressure needed + incf up,F ; yes -> increment to next gas... + bra TFT_gas_needs_helper ; ...and try the next gas +TFT_gas_needs_helper_1: ; no gases to show anymore, clear display area from potential remains of last invocation + STRCAT_PRINT " ---- " ; overwrite outdated stuff if screen position is not needed + return +TFT_gas_needs_helper_2: ; output gas type and pressure needed + movf up,W ; get gas number (0-4) to WREG + lfsr FSR1,opt_gas_O2_ratio ; read opt_gas_O2_ratio[WREG] + movff PLUSW1,lo ; copy result to lo + movf up,W ; get gas number (0-4) to WREG ; SHOULD NOT BE NEEDED AS movff SHOULD NOT ALTER wreg + lfsr FSR1,opt_gas_He_ratio ; read opt_gas_He_ratio[WREG] + movff PLUSW1,hi ; copy result to hi + call customview_show_mix ; print "Air", "O2", "21/35", etc. + STRCAT ":" + movf up,W ; get gas number (0-4) to WREG + rlncf WREG,W ; multipy by 2 + lfsr FSR1,int_O_tank_pres_need+0 ; read lower part of integer + movff PLUSW1,lo + movf up,W ; get gas number (0-4) to WREG ; SHOULD NOT BE NEEDED AS movff SHOULD NOT ALTER wreg + rlncf WREG,W ; multipy by 2 + lfsr FSR1,int_O_tank_pres_need+1 ; read upper part of integer + movff PLUSW1,hi + btfsc hi,int_prewarning_flag ; check if pre-warning flag is set (pres_need > pres_fill * threshold) + call TFT_attention_color ; yes, print gas need in yellow + btfsc hi,int_warning_flag ; check if warning flag is set (pres_need > pres_fill) + call TFT_warnings_color ; yes, print gas need in red + movff int_O_tank_pres_need+1,WREG ; get HIGH(int_O_tank_pres_need[0]) which hold flag for invalid data + btfsc WREG,int_invalid_flag ; check if invalid data flag is set + call TFT_disabled_color ; yes, print gas need in disabled color + bcf hi,int_prewarning_flag ; clear pre-warning flag for attention color + bcf hi,int_warning_flag ; clear warning flag for warning color + bcf hi,int_invalid_flag ; clear flag for invalid data (will actually only be set with 1st gas) + output_16_3 ; limit to 999 and display only (0-999) + STRCAT_PRINT " " ; adds a space to overwrite any potential remains of earlier outputs + incf up,F ; increment to next gas + goto TFT_standard_color ; and return... + + + global TFT_mask_ppo2 ; helper function for several custom views +TFT_mask_ppo2: call TFT_divemask_color - WIN_TINY dm_custom_ead_column, dm_custom_eadend_title_row + btfss FLAG_ccr_mode ; in CCR mode? + bra TFT_mask_ppo2a ; NO - continue checking for pSCR and OC + btfsc is_bailout ; in bailout? + bra TFT_mask_ppo2b ; YES + WIN_TINY dm_custom_ceiling_ppo2_col_dil,dm_custom_ceiling_text_row ; tuned position for longer text + STRCPY_TEXT_PRINT tppO2Dil ; print "ppO2(Dil)" + goto TFT_standard_color ; and return... +TFT_mask_ppo2a: + btfss FLAG_pscr_mode ; in pSCR mode? + bra TFT_mask_ppo2b ; NO - continue with OC mode (or bailout) + btfsc is_bailout ; in bailout? + bra TFT_mask_ppo2b ; YES + WIN_TINY dm_custom_ceiling_ppo2_col_dil,dm_custom_ceiling_text_row ; tuned position for longer text + STRCPY_TEXT_PRINT tppO2Mix ; print "ppO2(Mix)" + goto TFT_standard_color ; and return... +TFT_mask_ppo2b: ; OC mode or bailout + WIN_TINY dm_custom_ceiling_ppo2_column, dm_custom_ceiling_text_row ; normal position + STRCPY_TEXT_PRINT tppO2 ; in all other modes + goto TFT_standard_color ; and return... + + global TFT_display_pure_ppo2 ; show ppO2 of the pure gas - helper function for several custom views +TFT_display_pure_ppo2: + WIN_MEDIUM dm_custom_ceiling_ppo2_val_col, dm_custom_ceiling_value_row + movff int_O_pure_ppO2+0,lo ; copy ppO2 of the pure gas to hi:lo + movff int_O_pure_ppO2+1,hi + TFT_color_code warn_ppo2 ; color-code output + bsf leftbind + output_16dp .3 ; x.xx bar + bcf leftbind + STRCAT_PRINT "" + goto TFT_standard_color ; and return... + + + global TFT_ppo2_ead_end_cns_mask ; Show ppO2, END/EAD and CNS mask +TFT_ppo2_ead_end_cns_mask: + rcall TFT_mask_ppo2 + call TFT_divemask_color + WIN_TINY dm_custom_ead_column, dm_custom_eadend_title_row STRCPY_TEXT_PRINT tDiveEAD_END - WIN_TINY dm_custom_gf_title_col3, dm_custom_gf_title_row + WIN_TINY dm_custom_gf_title_col3, dm_custom_gf_title_row STRCPY_TEXT_PRINT tCNS2 - goto TFT_standard_color; and return... + goto TFT_standard_color ; and return... - - global TFT_ppo2_ead_end_cns ; Show ppO2, END/EAD and CNS + global TFT_ppo2_ead_end_cns ; Show ppO2, END/EAD and CNS TFT_ppo2_ead_end_cns: ;show ppO2 - rcall TFT_display_ppo2_val + rcall TFT_display_pure_ppo2 ; show ppO2 of the pure gas ; Show END/EAD WIN_SMALL dm_custom_ead_column, dm_custom_ead_row STRCPY_TEXT tEAD ; EAD: movff char_O_EAD,lo rcall TFT_end_ead_common ; print "lo m" (or ft) and limit to 8 chars - WIN_SMALL dm_custom_end_column, dm_custom_end_row + WIN_SMALL dm_custom_end_column, dm_custom_end_row STRCPY_TEXT tEND ; END: movff char_O_END,lo rcall TFT_end_ead_common ; print "lo m" (or ft) and limit to 8 chars ; Show CNS WIN_STD dm_custom_currentgf_column, dm_custom_currentgf_row - TFT_color_code warn_cns ; Color-code CNS output movff int_O_CNS_fraction+0,lo movff int_O_CNS_fraction+1,hi + TFT_color_code warn_cns ; Color-code CNS output bsf leftbind - output_16_3 ;Displays only 0...999 + output_16_3 ; Displays only 0...999 bcf leftbind STRCAT_PRINT "%" - goto TFT_standard_color; and return... + goto TFT_standard_color ; and return... -TFT_end_ead_common: ; print "lo m" (or ft) and limit to 8 chars +TFT_end_ead_common: ; print "lo m" (or ft) and limit to 8 chars bsf leftbind - TSTOSS opt_units ; 0=Meters, 1=Feets + TSTOSS opt_units ; 0=Meters, 1=Feets bra TFT_end_ead_common_metric ;TFT_end_ead_common_imperial: - ; With lo in m - movf lo,W - mullw .100 ; PRODL:PRODH = mbar/min + movf lo,W ; With lo in m + mullw .100 ; PRODL:PRODH = mbar/min movff PRODL,lo movff PRODH,hi - call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet output_16_3 STRCAT_TEXT tFeets clrf WREG - movff WREG,buffer+.8 ; limit string length to 8 + movff WREG,buffer+.8 ; limit string length to 8 bra TFT_end_ead_common_exit TFT_end_ead_common_metric: output_8 @@ -3647,59 +3975,45 @@ TFT_end_ead_common_exit: bcf leftbind movlw .8 - rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - STRCAT_PRINT "" + rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + STRCAT_PRINT "" return - global TFT_sensor_check_mask ; Show ppO2 of O2 and Diluent mask + + global TFT_sensor_check_mask ; show ppO2 of O2 and Diluent mask TFT_sensor_check_mask: call TFT_divemask_color - WIN_TINY dm_custom_s_check_text_column, dm_custom_s_check_text_row + WIN_TINY dm_custom_s_check_text_column, dm_custom_s_check_text_row STRCPY_TEXT_PRINT tSensorCheck - WIN_TINY dm_custom_ppO2_text_column, dm_custom_s_check_text_row + WIN_TINY dm_custom_ppO2_text_column, dm_custom_s_check_text_row STRCPY_TEXT_PRINT tppO2O2 - WIN_TINY dm_custom_ppDil_text_column, dm_custom_s_check_text_row + WIN_TINY dm_custom_ppDil_text_column, dm_custom_s_check_text_row STRCPY_TEXT_PRINT tppO2Dil - return - - global TFT_sensor_check ; Show ppO2 of O2 and Diluent + goto TFT_standard_color ; and return... + + global TFT_sensor_check ; show ppO2 of O2 and Diluent TFT_sensor_check: ; Show ppO2 of O2 in this depth - SAFE_2BYTE_COPY amb_pressure, xA - movlw d'10' - movwf xB+0 - clrf xB+1 - call div16x16 ; xC=p_amb/10 - movff xC+0,xA+0 - movff xC+1,xA+1 - movlw .100 - movwf xB+0 ; =O2 ratio - clrf xB+1 - call mult16x16 ; char_I_O2_ratio * p_amb/10 - call TFT_standard_color - TFT_color_code warn_ppo2 ; Color-code output (ppO2 stored in xC) - WIN_MEDIUM dm_custom_s_check_ppo2_o2_column, dm_custom_s_check_value_row -; ; hijacking neg_flag_velocity to know where the value is displayed - bsf neg_flag_velocity - call TFT_display_ppo2_com - + WIN_MEDIUM dm_custom_s_check_ppo2_o2_column, dm_custom_s_check_value_row + movff int_O_O2_ppO2+0,lo ; copy ppO2 of pure O2 to hi:lo + movff int_O_O2_ppO2+1,hi + TFT_color_code warn_ppo2 ; color-code output + bsf leftbind + output_16dp .3 ; x.xx bar + bcf leftbind + STRCAT_PRINT "" ; Show ppO2 of the diluent in this depth - SAFE_2BYTE_COPY amb_pressure, xA - movlw d'10' - movwf xB+0 - clrf xB+1 - call div16x16 ; xC=p_amb/10 - movff xC+0,xA+0 - movff xC+1,xA+1 - movff char_I_O2_ratio,xB+0 ; =O2 ratio - clrf xB+1 - call mult16x16 ; char_I_O2_ratio * p_amb/10 - call TFT_standard_color - TFT_color_code warn_ppo2 ; Color-code output (ppO2 stored in xC) WIN_MEDIUM dm_custom_s_check_ppo2_dil_col, dm_custom_s_check_value_row -; ; hijacking neg_flag_velocity to know where the value is displayed - bsf neg_flag_velocity - goto TFT_display_ppo2_com; and return... + movff int_O_pure_ppO2+0,lo ; copy ppO2 of pure gas to hi:lo + movff int_O_pure_ppO2+1,hi + TFT_color_code warn_ppo2 ; color-code output + bsf leftbind + output_16dp .3 ; x.xx bar + bcf leftbind + STRCAT_PRINT "" + goto TFT_standard_color ; and return... + +;============================================================================= global TFT_surface_lastdive TFT_surface_lastdive: @@ -3712,6 +4026,25 @@ STRCAT_TEXT_PRINT tMaxDepth ; Max. Depth call TFT_standard_color WIN_SMALL surf_gaslist_column+.48,surf_gaslist_row + + movff int_O_desaturation_time+0,lo ; bank-safe copies + movff int_O_desaturation_time+1,WREG + iorwf lo,W ; check if desaturation time is zero + bz TFT_surface_lastdive_1 ; YES - show last dive time + movff surface_interval+0,lo ; NO - show dive interval + movff surface_interval+1,hi + call convert_time ; lo=mins, hi=hours + movf hi,W + movff lo,hi + movwf lo ; exchange lo and hi + bsf leftbind + output_99x + PUTC 'h' + movff hi,lo + output_99x + STRCAT_PRINT "m " + bra TFT_surface_lastdive_2 +TFT_surface_lastdive_1: movff lastdive_time+0,xC+0 movff lastdive_time+1,xC+1 movff lastdive_time+2,xC+2 @@ -3719,23 +4052,24 @@ movlw LOW .3600 movwf xB+0 movlw HIGH .3600 - movwf xB+1 ; One day = 3600s - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + movwf xB+1 ; One day = 3600s + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder ;xC+0:xC+1 -> Full hours movff xC+1,xA+1 movff xC+0,xA+0 clrf xB+1 movlw .24 movwf xB+0 - call div16x16 ;xA/xB=xC with xA+0 as remainder + call div16x16 ;xA/xB=xC with xA+0 as remainder movff xC+0,lo - movff xC+1,hi ; Full days + movff xC+1,hi ; Full days bsf leftbind output_16 PUTC "d" - movff xA+0,lo ; Full hours + movff xA+0,lo ; Full hours output_8 - STRCAT_PRINT "h" + STRCAT_PRINT "h " +TFT_surface_lastdive_2: WIN_SMALL surf_gaslist_column+.48,surf_gaslist_row+(surf_gaslist_spacing*.1) movff lastdive_duration+0,lo movff lastdive_duration+1,hi @@ -3747,37 +4081,36 @@ WIN_SMALL surf_gaslist_column+.48,surf_gaslist_row+(surf_gaslist_spacing*.2) movff lastdive_maxdepth+0,lo movff lastdive_maxdepth+1,hi - TSTOSS opt_units ; 0=Meters, 1=Feets + TSTOSS opt_units ; 0=Meters, 1=Feets bra TFT_surface_lastdive_metric ;imperial - rcall convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + rcall convert_mbar_to_feet ; convert value in lo:hi from mbar to feet output_16_3 ; limit to 999 and display only (0-999) STRCAT_TEXT tFeets1 bra TFT_surface_lastdive2 TFT_surface_lastdive_metric: bsf ignore_digit5 ; no cm... - movlw d'1' ; +1 - movff WREG,ignore_digits ; no 1000m + movlw d'1' ; +1 + movff WREG,ignore_digits ; no 1000m output_16dp .3 ; xxx.y STRCAT_TEXT tMeters TFT_surface_lastdive2: STRCAT_PRINT "" bcf leftbind - return ; Done. - + return ; Done. + +;============================================================================= + global TFT_surface_tissues -TFT_surface_tissues: ; Show Tissue diagram in surface mode +TFT_surface_tissues: ; Show Tissue diagram in surface mode WIN_SMALL surf_tissue_N2_column,surf_tissue_N2_row STRCPY_TEXT_PRINT tN2 WIN_SMALL surf_tissue_He_column,surf_tissue_He_row STRCPY_TEXT_PRINT tHe - call deco_calc_desaturation_time ; calculate desaturation time (and char_O_tissue_N2_saturation and char_O_tissue_He_saturation) - movlb b'00000001' ; select ram bank 1 - - movlw color_deepblue - call TFT_set_color ; Make this configurable? + movlw color_deepblue + call TFT_set_color ; Make this configurable? WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.29,.29 WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.37,.37 WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.45,.45 @@ -3786,261 +4119,226 @@ WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.69,.69 WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.77,.77 WIN_FRAME_COLOR16 surf_tissue_diagram_top+.23,surf_tissue_diagram_bottom-.4,.85,.85 - WIN_FRAME_STD surf_tissue_diagram_top, surf_tissue_diagram_bottom, surf_tissue_diagram_left, surf_tissue_diagram_right ; outer frame + WIN_FRAME_STD surf_tissue_diagram_top, surf_tissue_diagram_bottom, surf_tissue_diagram_left, surf_tissue_diagram_right ; outer frame movlw .1 - movff WREG,win_height ; row bottom (0-239) - movlw surf_tissue_diagram_left+.4 ; Surface mode - movff WREG,win_leftx2 ; column left (0-159) - movlw surf_tissue_diagram_right - surf_tissue_diagram_left - .4 ; Width + movff WREG,win_height ; row bottom (0-239) + + ;---- Draw N2 Tissues ---------------------------------------------------- + + movlw surf_tissue_diagram_left+.4 ; start position for N2 bars + movff WREG,win_leftx2 ; column left (0-159) + movlw surf_tissue_diagram_right - surf_tissue_diagram_left - .4 ; max width for N2 bars movff WREG,win_width - ;---- Draw N2 Tissues lfsr FSR2, char_O_tissue_N2_saturation movlw d'16' - movwf wait_temp ; 16 tissues - clrf waitms_temp ; Row offset + movwf wait_temp ; 16 tissues + clrf waitms_temp ; row offset surf_tissue_saturation_graph_N2: - movlw surf_tissue_diagram_top+.23 ; surface mode + movlw surf_tissue_diagram_top+.23 ; surface mode addwf waitms_temp,W - movff WREG,win_top ; row top (0-239) - rcall surf_tissue_saturation_loop ; Show one tissue + movff WREG,win_top ; row top (0-239) + rcall surf_tissue_saturation_loop ; show one tissue decfsz wait_temp,F bra surf_tissue_saturation_graph_N2 ;---- Draw He Tissues ---------------------------------------------------- + + movlw surf_tissue_diagram_left + .24 ; start position for He bars (.15 without x2) + movff WREG,win_leftx2 ; column left (0-159) + movlw surf_tissue_diagram_right - surf_tissue_diagram_left - .24 ; max width for He bars + movff WREG,win_width + lfsr FSR2, char_O_tissue_He_saturation movlw d'16' - movwf wait_temp ; 16 tissues - clrf waitms_temp ; Row offset + movwf wait_temp ; 16 tissues + clrf waitms_temp ; row offset surf_tissue_saturation_graph_He: - movlw surf_tissue_diagram_top+.23+.56 ; surface mode + movlw surf_tissue_diagram_top+.23+.56 ; surface mode addwf waitms_temp,W - movff WREG,win_top ; row top (0-239) - rcall surf_tissue_saturation_loop ; Show one tissue + movff WREG,win_top ; row top (0-239) + rcall surf_tissue_saturation_loop ; show one tissue decfsz wait_temp,F bra surf_tissue_saturation_graph_He - return + + WIN_SMALL surf_tissue_He_column+.22,surf_tissue_He_row ; position in-between tissue bars + movff int_O_CNS_fraction+0,lo + movff int_O_CNS_fraction+1,hi + TFT_color_code warn_cns + STRCPY_TEXT tCNS2 ; CNS: + bsf leftbind + output_16_3 ; Displays only 0...999 + bcf leftbind + STRCAT_PRINT "%" + goto TFT_standard_color ; and return... surf_tissue_saturation_loop: call TFT_standard_color movlw .2 ; row spacing addwf waitms_temp,F - movf POSTINC2,W ; Get tissue load - bcf STATUS,C - rrcf WREG ; And divide by 2 + movf POSTINC2,W ; get tissue load + bcf WREG,7 ; clear flag bit for sat/desat info (not used in surface mode) + rlncf WREG,W ; multiply with 2 (previously cleared bit 7 will be rotated to bit 0) + incf WREG,W ; add 1 for a minimum visible bar (He-bars could be invisible else-wise) movwf temp1 - movlw .20 - subwf temp1,F ; Subtract some offset - movf win_width+0,W ; Max width. - cpfslt temp1 ; skip if WREG < win_width - movwf temp1 + movff win_width+0,WREG ; get max window width (win_width) + cpfslt temp1 ; skip if WREG < win_width + movwf temp1 ; crop length to win_width + ; no need to be able to draw longer bars – + ; we are at the surface and if bars would + ; even touch the max length possible here, + ; the diver would be in severe decompression + ; issues if not dead already... movff temp1,win_bargraph clrf win_width+1 - goto TFT_box ; and return... + goto TFT_box ; and return... ;============================================================================= -; Draw saturation graph, is surface mode or in dive mode. +; Draw saturation graph in dive mode. + DISP_tissue_saturation_graph: ;---- Draw Frame call TFT_standard_color WIN_FRAME_COLOR16 dm_custom_tissue_diagram_top, dm_custom_tissue_diagram_bottom, dm_custom_tissue_diagram_left, .159 ; outer frame movlw .1 - movff WREG,win_height ; row bottom (0-239) - movlw dm_custom_tissue_diagram_left+.3 ; divemode - movff WREG,win_leftx2 ; column left (0-159) - movlw .159-dm_custom_tissue_diagram_left-.4 ; Width + movff WREG,win_height ; row bottom (0-239) + + ;---- Draw N2 Tissues ---------------------------------------------------- + + movlw dm_custom_tissue_diagram_left+.3 ; divemode + movff WREG,win_leftx2 ; column left (0-159) + movlw .159-dm_custom_tissue_diagram_left-.4 ; width movff WREG,win_width - ;---- Draw N2 Tissues lfsr FSR2, char_O_tissue_N2_saturation movlw d'16' - movwf wait_temp ; 16 tissues - clrf waitms_temp ; Row offset + movwf wait_temp ; 16 tissues + clrf waitms_temp ; row offset tissue_saturation_graph_N2: - movlw dm_custom_tissue_diagram_top+.3 ; divemode - rcall tissue_saturation_graph_loop ; Show one tissue + movlw dm_custom_tissue_diagram_top+.3 ; divemode + rcall tissue_saturation_graph_loop ; show one tissue decfsz wait_temp,F bra tissue_saturation_graph_N2 ;---- Draw He Tissues ---------------------------------------------------- + + movlw dm_custom_tissue_diagram_left + .8 ; divemode + movff WREG,win_leftx2 ; column left (0-159) + movlw .159 - dm_custom_tissue_diagram_left - .14 ; width + movff WREG,win_width + lfsr FSR2, char_O_tissue_He_saturation movlw d'16' - movwf wait_temp ; 16 tissues - clrf waitms_temp ; Row offset + movwf wait_temp ; 16 tissues + clrf waitms_temp ; row offset tissue_saturation_graph_He: - movlw dm_custom_tissue_diagram_top+.3+.22 ; divemode - rcall tissue_saturation_graph_loop ; Show one tissue - + movlw dm_custom_tissue_diagram_top+.3+.22 ; divemode + rcall tissue_saturation_graph_loop ; show one tissue decfsz wait_temp,F bra tissue_saturation_graph_He - return + goto TFT_standard_color ; and return... tissue_saturation_graph_loop: - addwf waitms_temp,W - movff WREG,win_top ; row top (0-239) - - call TFT_standard_color + addwf waitms_temp,W + movff WREG,win_top ; row top (0-239) + movlw color_cyan ; preset color for tissues with decreasing pressure + call TFT_set_color incf waitms_temp,F movf POSTINC2,W - bcf STATUS,C - rrcf WREG + btfss WREG,7 ; check fs flag for increasing tissue pressure set + bra tissue_saturation_graph_loop_1 ; NO - keep color + movwf temp1 ; YES - buffer WREG + movlw color_orange ; select color for tissues with increasing pressure + call TFT_set_color ; change color + movf temp1,W ; restore WREG +tissue_saturation_graph_loop_1: + bcf WREG,7 ; clear flag bit bcf STATUS,C - rrcf WREG ; And divide by 4 + rrcf WREG ; divide by 2 + incf WREG,W ; add a bit for a minimum visible bar movwf temp1 - movlw .12 - subwf temp1,F ; Subtract some offset - movf win_width,W ; Max width. - cpfslt temp1 ; skip if WREG < win_width + ;movlw .1 + ;addwf temp1,F ; add a bit for a minimum visible bar (old version) + movf win_width,W ; get max window width (win_width) + cpfslt temp1 ; skip if WREG < win_width movwf temp1 movff temp1,win_bargraph clrf win_width+1 - goto TFT_box ; and return - + goto TFT_box ; and return... + +;============================================================================= global TFT_display_cns TFT_display_cns: - rcall TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; No - call TFT_warning_set_window_com - TFT_color_code warn_cns ; Color-code CNS output - STRCPY_TEXT tCNS2 ; CNS: - movff int_O_CNS_fraction+0,lo + call TFT_warning_set_window ; Sets the row and column for the current warning + tstfsz WREG ; Is there room for the warning? + return ; No + STRCPY_TEXT tCNS ; CNS: + movff int_O_CNS_fraction+0,lo movff int_O_CNS_fraction+1,hi - bsf leftbind - output_16_3 ;Displays only 0...999 - bcf leftbind + TFT_color_code warn_cns ; Color-code CNS output + bsf leftbind + output_16_3 ; Displays only 0...999 + bcf leftbind PUTC "%" - movlw dm_warning_length ; Divemode string length - btfss divemode ; In Divemode? - movlw surf_warning_length ; No, use surface string length - rcall TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + movlw dm_warning_length ; Divemode string length + btfss divemode ; In Divemode? + movlw surf_warning_length ; No, use surface string length + call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + STRCAT_PRINT "" + bcf win_invert + goto TFT_standard_color ; and return... + + + global TFT_display_eod_cns +TFT_display_eod_cns: + call TFT_warning_set_window ; Sets the row and column for the current warning + tstfsz WREG ; Is there room for the warning? + return ; No + call TFT_warnings_color ; switch to warnings (red) text color + STRCPY_TEXT tCNSeod ; end-of-dive CNS warning text + movlw dm_warning_length ; Divemode string length + call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) STRCAT_PRINT "" - bcf win_invert - goto TFT_standard_color; and return... - - global TFT_mask_ppo2 -TFT_mask_ppo2: - call TFT_divemask_color - btfss FLAG_ccr_mode - bra TFT_mask_ppo2a ; not in CC mode - btfsc is_bailout - bra TFT_mask_ppo2a ; in CC mode but in bailout - WIN_TINY dm_custom_ceiling_ppo2_col_dil,dm_custom_ceiling_text_row ; NEW position for loger text - STRCPY_TEXT_PRINT tppO2Dil ; in CC mode and not bailout - goto TFT_standard_color ; and return... - -TFT_mask_ppo2a: - WIN_TINY dm_custom_ceiling_ppo2_column, dm_custom_ceiling_text_row - STRCPY_TEXT_PRINT tppO2 ; in all other modes - goto TFT_standard_color; and return... - - global TFT_display_ppo2_val -TFT_display_ppo2_val: - btfss FLAG_pscr_mode - bra TFT_display_ppo2_val_non_pscr ; Non-PSCR modes... - btfsc is_bailout - bra TFT_display_ppo2_val_non_pscr ; In bailout - - ; in PSCR mode - call compute_pscr_ppo2 ; pSCR ppO2 into sub_c:2 - movff sub_c+0,xA+0 - movff sub_c+1,xA+1 - movlw d'100' - movwf xB+0 - clrf xB+1 - call div16x16 ; /100 - tstfsz xC+1 ; Is ppO2 > 2.55bar ? - setf xC+0 ; yes: bound to 2.55... better than wrap around. - movff xC+0,char_I_actual_ppO2 ; copy last ppO2 to buffer register (for pSCR CNS) - clrf xC+2 - clrf xC+3 - movff sub_c+0,xC+0 - movff sub_c+1,xC+1 ; copy for comptibility - bra TFT_display_ppo2_val_com - -TFT_display_ppo2_val_non_pscr: - SAFE_2BYTE_COPY amb_pressure, xA - movlw d'10' - movwf xB+0 - clrf xB+1 - call div16x16 ; xC=p_amb/10 - movff xC+0,xA+0 - movff xC+1,xA+1 - movff char_I_O2_ratio,xB+0 ; =O2 ratio - clrf xB+1 - call mult16x16 ; char_I_O2_ratio * p_amb/10 - -TFT_display_ppo2_val_com: - call TFT_standard_color - TFT_color_code warn_ppo2 ; Color-code output (ppO2 stored in xC) - WIN_MEDIUM dm_custom_ceiling_ppo2_val_col, dm_custom_ceiling_value_row - ; hijacking neg_flag_velocity to know where the value is displayed - bsf neg_flag_velocity - bra TFT_display_ppo2_com - - global TFT_display_ppo2 -TFT_display_ppo2: ; Show ppO2 (ppO2 stored in xC, in mbar!) - rcall TFT_warning_set_window ; Sets the row and column for the current warning - tstfsz WREG ; Is there room for the warning? - return ; No - call TFT_warning_set_window_com - TFT_color_code warn_ppo2 ; Color-code output (ppO2 stored in xC) + goto TFT_standard_color ; and return... + + + global TFT_display_ppo2 +TFT_display_ppo2: + call TFT_warning_set_window ; Sets the row and column for the current warning + tstfsz WREG ; Is there room for the warning? + return ; No + movff int_O_pure_ppO2+0,lo ; copy ppO2 of the pure gas (OC: = breathed gas, loop: = diluent/premix) to hi:lo + movff int_O_pure_ppO2+1,hi + TFT_color_code warn_ppo2 ; Color-code output + btfss FLAG_ccr_mode ; in CCR mode? + bra TFT_display_diluent_1 ; NO - continue with pSCR or OC + btfsc is_bailout ; YES - in bailout? + bra TFT_display_diluent_2 ; YES - continue with OC + STRCPY_TEXT tdil ; NO - print "Dil:" + bra TFT_display_diluent_3 +TFT_display_diluent_1: + btfss FLAG_pscr_mode ; in pSCR mode? + bra TFT_display_diluent_2 ; NO - continue with pSCR or OC + btfsc is_bailout ; YES - in bailout? + bra TFT_display_diluent_2 ; YES - continue with OC + STRCPY_TEXT tmix ; NO - print "Mix:" + bra TFT_display_diluent_3 +TFT_display_diluent_2: + STRCPY_TEXT tppO2 ; OC mode or bailout, print "ppO2:" +TFT_display_diluent_3: + bsf leftbind + output_16dp .3 ; x.xx bar + bcf leftbind + movlw dm_warning_length ; Divemode string length + call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) + STRCAT_PRINT "" + goto TFT_standard_color ; and return... - btfss FLAG_ccr_mode ; new code to conditionally name the warning ppO2: or Dil: - bra TFT_display_ppo2_none_ccr ; ppO2 warning text - btfsc is_bailout - bra TFT_display_ppo2_none_ccr ; ccr-mode but in bailout, ppO2 warning text again - ; ccr-mode and no bailout - STRCPY_TEXT tdil ; "Dil:" - bra TFT_display_ppo2_cont - -TFT_display_ppo2_none_ccr: - STRCPY_TEXT tppO2 ; "ppO2:" -TFT_display_ppo2_cont: - ; hijacking neg_flag_velocity to know where the value is displayed - bcf neg_flag_velocity -TFT_display_ppo2_com: -; Check very high ppO2 manually - tstfsz xC+2 ; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar? - bra TFT_show_ppO2_3 ; Yes, display fixed Value! - movff xC+0,lo - movff xC+1,hi - bsf ignore_digit4 ; no mbar resolution - output_16dp d'1' - -; Set ".xx" to "0.xx" (bar) - banksel buffer - movlw " " - cpfseq buffer+5 ; For ppO2 in warning area - bra TFT_show_ppO2_1 - movlw "0" ; Replace Space with "0" - movwf buffer+5 -TFT_show_ppO2_1: - movlw " " - cpfseq buffer+0 ; For ppO2 in custom view - bra TFT_show_ppO2_2 - movlw "0" ; Replace Space with "0" - movwf buffer+0 -TFT_show_ppO2_2: - banksel common - movlw dm_warning_length ; Divemode string length - ; neg_flag_velocity is hijacked, used to toggle the fillup lenght. - btfsc neg_flag_velocity - movlw .4 - call TFT_fillup_with_spaces ; Fillup FSR2 with spaces (Total string length in #WREG) - STRCAT_PRINT "" - bcf win_invert - goto TFT_standard_color; and return... - -TFT_show_ppO2_3: -; STRCAT "'6.6" ; Workaround until a ">" is available in STD font - STRCAT "6.65" ; Workaround until a ">" is available in STD font - bra TFT_show_ppO2_2 - - +;============================================================================= + global TFT_LogOffset_Logtitle TFT_LogOffset_Logtitle: STRCPY_TEXT tLogOffset @@ -4050,16 +4348,17 @@ output_16_4 bcf leftbind PUTC " " - return ; No "_PRINT" here... + return ; No "_PRINT" here... + +;============================================================================= global adjust_depth_with_salinity + global adjust_depth_with_salinity_log adjust_depth_with_salinity: ; computes salinity setting into lo:hi [mbar] - btfsc simulatormode_active ; Do apply salinity in Simulatormode + btfsc simulatormode_active ; Do not apply salinity in Simulatormode return - - global adjust_depth_with_salinity_log movff opt_salinity,WREG ; 0-5% -adjust_depth_with_salinity_log: ; computes salinity setting (FROM WREG!) into lo:hi [mbar] +adjust_depth_with_salinity_log: ; computes salinity setting (FROM WREG!) into lo:hi [mbar] addlw d'100' ; 1.00kg/l movwf wait_temp @@ -4076,7 +4375,7 @@ movlw d'102' ; 0,98bar/10m movwf xB+0 clrf xB+1 - call mult16x16 ;xA*xB=xC (lo:hi * 100) + call mult16x16 ; xA*xB=xC (lo:hi * 100) movff wait_temp,xB+0 ; Salinity clrf xB+1 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder @@ -4084,6 +4383,8 @@ movff xC+1,hi ; restore lo and hi with updated value return +;============================================================================= + global convert_mbar_to_feet ; convert value in lo:hi from mbar to feet convert_mbar_to_feet: ; convert value in lo:hi from mbar to feet movff lo,xA+0 @@ -4114,9 +4415,11 @@ movff xC+1,hi ; restore lo and hi with updated value return +;============================================================================= + global convert_celsius_to_fahrenheit ; convert value in lo:hi from celsius to fahrenheit -convert_celsius_to_fahrenheit: ; convert value in lo:hi from celsius to fahrenheit - movff lo,xA+0 ; temperature in 1/10 of °C +convert_celsius_to_fahrenheit: ; convert value in lo:hi from celsius to fahrenheit + movff lo,xA+0 ; temperature in 1/10 of °C movff hi,xA+1 movlw LOW d'1000' ; offset °C value by 1000 to get out of any negative numbers @@ -4144,52 +4447,7 @@ movff xC+0,lo movff xC+1,hi ; restore lo and hi with updated value return - + ;============================================================================= - global compute_pscr_ppo2 -compute_pscr_ppo2: -; (Pressure[mbar]*char_I_O2_ratio)-(100-char_I_O2_ratio)*CF61*CF62*10 - movff char_I_O2_ratio,WREG - sublw .100 ; 100-char_I_O2_ratio -> WREG - mullw .10 ; (100-char_I_O2_ratio)*10 -> PROD:2 - movff PRODL,xA+0 - movff PRODH,xA+1 - movff opt_PSCR_drop,xB+0 ; O2 Drop - clrf xB+1 - call mult16x16 ;xA*xB=xC -> (100-char_I_O2_ratio)*10*CF61 - movff xC+0,xA+0 - movff xC+1,xA+1 - movff opt_PSCR_lungratio,xB+0 ; Lung ratio - clrf xB+1 - call mult16x16 ;xA*xB=xC -> (100-char_I_O2_ratio)*10*CF61*CF62 - - movlw .10 - movwf xB+0 - clrf xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - ; store xC:2 in lo:hi - movff xC+0,lo - movff xC+1,hi - - SAFE_2BYTE_COPY amb_pressure, xA - movff char_I_O2_ratio,xB+0 - clrf xB+1 - call mult16x16 ;xA*xB=xC -> xC:4 = Pressure[mbar]*char_I_O2_ratio - - movlw .10 - movwf xB+0 - clrf xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - - ; store xC:2 in sub_a - movff xC+0,sub_a+0 - movff xC+1,sub_a+1 - ; reload result from lo:hi - movff lo,sub_b+0 - movff hi,sub_b+1 - - call subU16 ;sub_c = sub_a - sub_b (with UNSIGNED values) - return - - + END \ No newline at end of file
--- a/src/tft_outputs.inc Wed Dec 27 14:34:11 2017 +0100 +++ b/src/tft_outputs.inc Wed Jan 31 19:39:37 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File tft_outputs.inc +; File tft_outputs.inc REFACTORED VERSION V2.94 ; ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. @@ -17,54 +17,43 @@ ; Surface mode extern TFT_surface_lastdive - extern TFT_show_OC_startgas_surface ; Show first gas and "OSTC2-like" active gases + extern TFT_show_OC_startgas_surface ; Show first gas and "OSTC2-like" active gases extern TFT_serial extern TFT_clock extern TFT_date extern TFT_desaturation_time extern TFT_nofly_time - extern TFT_interval extern TFT_gaslist_surfmode extern TFT_dillist_surfmode - extern TFT_splist_surfmode ; Show Setpoint list + extern TFT_splist_surfmode ; Show Setpoint list extern TFT_temp_surfmode extern TFT_update_batt_voltage extern TFT_display_decotype_surface - extern TFT_display_decotype_surface1 ; Used from logbook! + extern TFT_display_decotype_surface1 ; Used from logbook! extern TFT_update_surf_press - extern TFT_surface_sensor ; Update HUD data in surface mode + extern TFT_surface_sensor ; Update HUD data in surface mode extern TFT_sensor_surface_warning -; extern TFT_clear_customview_surfacemode - extern TFT_menu_hud ; Update HUD data in menu (including mV) - extern TFT_menu_calibrate ; Update mV data in menu - extern TFT_custom_text ; The custom text - extern TFT_surface_tissues ; Show Tissue diagram in surface mode -; extern TFT_surface_compass_mask ; Compass heading mask -; extern TFT_surface_compass_heading ; Compass heading value - extern TFT_surface_decosettings ; Show all deco settings - extern TFT_cat_serial ; Add serial to current string - extern TFT_cat_firmware ; Add firmware version to current string -; extern TFT_compass_show_gain ; Show the current compass gain -; extern TFT_show_timeout_testmode ; Show the timeout during calibration + extern TFT_menu_calibrate ; Update mV data in menu + extern TFT_custom_text ; The custom text + extern TFT_surface_tissues ; Show Tissue diagram in surface mode + extern TFT_surface_decosettings ; Show all deco settings + extern TFT_cat_serial ; Add serial to current string + extern TFT_cat_firmware ; Add firmware version to current string + ; Menu extern TFT_LogOffset_Logtitle - extern TFT_show_color_schemes ; Yes, update the color schemes - -; Debug and useless stuff -; extern TFT_update_raw_data -; extern TFT_update_raw_data2 -; extern TFT_compass_fast + extern TFT_show_color_schemes ; Yes, update the color schemes ; Dive mode extern TFT_display_cns extern TFT_divemins extern TFT_depth extern TFT_temp_divemode - extern TFT_max_pressure + extern TFT_max_depth extern TFT_active_gas_divemode extern TFT_divemode_mask extern TFT_display_ndl_mask - extern TFT_show_TTS_divemode + extern TFT_display_tts extern TFT_display_ndl extern TFT_display_deko_mask extern TFT_divemode_warning @@ -74,13 +63,12 @@ extern TFT_display_deko extern TFT_mask_ppo2 extern TFT_display_ppo2 - extern TFT_display_ppo2_val extern TFT_update_batt_percent_divemode extern TFT_display_apnoe_descent extern TFT_apnoe_clear_surface extern TFT_display_apnoe_surface extern TFT_display_apnoe_last_max - extern TFT_ftts + extern TFT_display_ftts extern TFT_clear_warning_text extern TFT_clear_warning_text_2nd_row extern TFT_warning_gf @@ -92,17 +80,13 @@ extern TFT_clear_divemode_menu ; Clear the divemode menu extern TFT_draw_gassep_line ; Draw the gas separator grid line in spec mode only extern TFT_divemode_menu_cursor ; the divemode cursor - extern TFT_battinfo_tissues_clock_mask ; Setup Mask - extern TFT_battinfo_tissues_clock ; Show EAD/END, Tissues and clock + extern TFT_battinfo_tissues_clock_mask ; Setup Mask + extern TFT_battinfo_tissues_clock ; Show EAD/END, Tissues and clock extern TFT_gf_mask ; Setup Mask extern TFT_gf_mask_cGF ; Setup Mask - current GF only extern TFT_gf_info ; Show GF informations extern TFT_warning_agf ; Show a warning if aGF is selected -; extern TFT_dive_compass_mask ; Compass mask -; extern TFT_dive_compass_heading ; Compass heading - extern TFT_dyn_gaslist ; Show the dyn gaslist extern TFT_divetimeout ; Show timeout counter - extern TFT_hud_voltages ; Show HUD details extern TFT_show_safety_stop ; Show the safety stop extern TFT_clear_decoarea ; Cleanup deco area on screen extern TFT_ceiling_mask ; The ceiling mask @@ -111,19 +95,31 @@ extern TFT_warning_fallback ; Show fallback warning extern TFT_sensor_check_mask ; Show ppO2 of O2 and Diluent mask extern TFT_sensor_check ; Show ppO2 of O2 and Diluent - extern TFT_ppo2_ead_end_cns_mask ; Show ppO2, END/EAD and CNS mask - extern TFT_ppo2_ead_end_cns ; Show ppO2, END/EAD and CNS - extern compute_pscr_ppo2 ; Compute ppO2 for PSCR mode - extern TFT_pscr_info_mask ; Show ppO2, drop and lung ratio mask - extern TFT_pscr_info ; Show ppO2, drop and lung ratio - + extern TFT_ppo2_ead_end_cns_mask ; Show ppO2, END/EAD and CNS mask + extern TFT_ppo2_ead_end_cns ; Show ppO2, END/EAD and CNS + extern TFT_pscr_info_mask ; Show ppO2, drop and lung ratio mask + extern TFT_pscr_info ; Show ppO2, drop and lung ratio + extern TFT_gas_needs_mask + extern TFT_gas_needs + extern TFT_warning_gas_needs_warn + extern TFT_warning_gas_needs_att + extern TFT_warning_sensor_disagree + extern TFT_warning_IBCD + extern TFT_CNS_mask + extern TFT_CNS + extern TFT_display_eod_cns + extern TFT_warning_mbubbles + extern TFT_warning_outside + extern TFT_display_pure_ppo2 + extern TFT_info_deco + extern TFT_show_mode_divemode ; Misc extern TFT_standard_color extern TFT_disabled_color extern TFT_attention_color extern TFT_warnings_color - extern TFT_divemask_color + extern TFT_divemask_color extern adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] extern adjust_depth_with_salinity_log ; computes salinity setting (FROM WREG!) into lo:hi [mbar] extern TFT_convert_date_short @@ -131,5 +127,11 @@ extern TFT_convert_date extern TFT_debug_output extern TFT_show_time_date_menu - extern convert_mbar_to_feet ; convert value in lo:hi from mbar to feet - extern convert_celsius_to_fahrenheit ; convert value in lo:hi from celsius to fahrenheit \ No newline at end of file + extern convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + extern convert_celsius_to_fahrenheit ; convert value in lo:hi from celsius to fahrenheit + +; Alt dive mode (aka Blind mode) + extern TFT_divemins_alternative + extern TFT_divemode_mask_alternative + extern TFT_max_depth_alternative + extern TFT_big_deco_alt ; The big deco \ No newline at end of file
--- a/tools/dev_ostc3_firmware.hex Wed Dec 27 14:34:11 2017 +0100 +++ b/tools/dev_ostc3_firmware.hex Wed Jan 31 19:39:37 2018 +0100 @@ -1,7682 +1,7682 @@ -:000000860cbb270091748074a7f4beb671c667 -:00001044167c0d515f9ca30ea1960ed17f4dcd -:00002044d673830c4d3548de227fa72f8e5eb1 -:000030864ae825ecb3862292b33c3d29074de5 -:0000401fef954482586ce1a2e77461f36ea73e -:000050a77dc521eb93ffdb149ae31b96452202 -:00006052ee394d064ca3ae6fee924ba24370dd -:000070ddcbc57c1aeb10602efcb8f1402ae337 -:0000802f3727e72e87f100bf9d0981c9084c00 -:0000905ed9551b8b471bdd9e73d28798ab6c03 -:0000a0f0f6a9a6adfaa375548f3347b818628e -:0000b0a9ca01fa76182cf7e0786a7b6a321f18 -:0000c06080631761a212bf4d0aaa6ada96d929 -:0000d0332d9d6e7d512c9f882a081142c2813b -:0000e0fb6374d3e8dad11def353f0c8c870bb0 -:0000f038172a252761934563a696bd245770fe -:00010096f21b3cea8c16a5374e946474d95f12 -:0001106befe9a96e3fc6db5c58aa69eebbbb21 -:000120f3c01a9ef64af638834ac9ef09c8d4d3 -:00013033fb7b6bea8b07ab4d8d978b5e596d23 -:000140acccbf01dab93364fc320a5e0a908faa -:000150b427663ae0041790e3feb62e3eb87cbf -:000160d4fd5483545028e0b355548f37c940a5 -:000170e42debf823dfe04ce5b81281323b5baa -:00018028d678b2ebd9addf31e163252813b53a -:0001909cecf6265f4ede586d0cf937b92ad717 -:0001a03060198f4b004a9baecfbf467b44e3e7 -:0001b03953dc669156938bc24a1b3528509ffb -:0001c0bd277e7576b5ee2cf6ffe5f2dc3fac3e -:0001d0a423817c2307191bfb14f4cf3cec9541 -:0001e02914e319bf1f51fdb4fd6f0223622b83 -:0001f04e907bb80f9a711b9bab4bfabc74c3cf -:0002000b97e52dcc2db6d18cb0a129752729ed -:000210903666bc801abc787005f390583b9c2d -:000220046a58296f2c888f47e95be00078199f -:000230035e48826d51fdedd4d8c74382da4ec5 -:0002402ef384d81f01d6e0e2461dc64d89f8ca -:00025005161c675e7727b48d90ba827b45722e -:00026038744486debc310fb6d2066ec7034fa4 -:000270217f9ac5e8b33d8a542d67235854f397 -:0002801b224764d4bb063e5dcb1de4761740df -:00029085a383fc89839c577eaa3ea4e8d794a0 -:0002a07556a63024a9125b2fe631dcc8a47ab7 -:0002b0f34ef0f84c93e7caaf09923ab92c6d6f -:0002c0cdeb618915b1bd0c6933aa1fb8743bc5 -:0002d0cfd1efdabf2431a07b9fb6548c530998 -:0002e0f676c13945bd04ebea63524f331a832e -:0002f0310c668b1c1c99ec8f57031799f25fa7 -:000300e87336c0149e1d330e2b02b9ef89977a -:000310db04e28ff42c710cc2e731af567d93eb -:000320617ca9ceebb5e2f1b9b20e719f9e348a -:0003301e45cbadb22a4cdb7de2aa1671f52623 -:0003408feb90c52e7f45d90db86eb73e80e034 -:000350d668f18d0a6d12c6e42bdd265f2646bd -:0003601b57d192482dd48fb0911517060ae54b -:000370870c7b5cbd2d8184c73213caecea101a -:000380d1d7a806727203d4a36bb649ba6726e2 -:0003907270e5521fbf711daf53ec5c32826b68 -:0003a09e01c98ef313462b385a3a9b4654b6f0 -:0003b06b95fbc16d4284e00fbcf10d18b5a7e4 -:0003c06344803763e81b18f04f8469679dbbcc -:0003d038b4e6a636b7a50af3e26862be1dcd6c -:0003e075b034e059364e30c830f808db0dd6a5 -:0003f01a95174381a1bcbbc6e6fd8198c09c46 -:000400ef52eef2527ed04460547e3c67fb029d -:00041086598a97387e5095e8e55fb60e8f8c57 -:000420a4e9d0a719aae79c78246211683860db -:000430b60b6dc41ad4bc8b21ada94caa77e727 -:000440517769d8ba8bc98099b1f713c8dcebf6 -:000450e17a7a8da237dc513231a1eedd7c988a -:000460d8e4c5b2f949b4df6a9af10f68949a30 -:000470c229e4c066a41ee581e0c55a3b6ce4e8 -:0004802d917c9ccf25f1a4d3c624e7b43f9cbe -:0004908ab72bd0d15ce8ba59e6dd33da110d05 -:0004a0c6badf5a034a7c79b3e96fe2c852167b -:0004b0da73ff807cdcef147898a7b094790ffb -:0004c0053eadf7a9b0bf0fdb9f99227dc36894 -:0004d0198b842fae94a9a0b5bc5f7d0d87c826 -:0004e0eff7c6dcb349dce2ad2c3ba2dca7dab6 -:0004f0f77284576eeeeb39e79e58d70da41692 -:000500251aecee21171b90250bca87eaf8d5cd -:00051086b7cd653fd3bbe4e557d4c4ca3bdb0a -:0005202e321942514cbbee3da5084728e0aefb -:000530e4a77e3cd8f7abbfc18b8d0437afb121 -:000540e4b8c9b27db04bbd8a3913c728cebbc1 -:0005503a44a89dd34d05960be80be9d08f0536 -:0005604a635aa33d0135b58f07a6329e98b7a1 -:00057040bbb25f6f80b4a2136914bf6625a519 -:0005809734d2b52935f5dd3cdeaa1d1d881f8a -:000590ebb29f13cc262cd062e3057da22d6c79 -:0005a0a4abe0b2fde69957bdf34ae524057cbf -:0005b0781b42d9e0d7650caa4175aef950f844 -:0005c01c2c80bbc21ab2550168a594b17fe3eb -:0005d09b28f32ec7e660ae2140bbd99405ceec -:0005e0a0670af1460ea1b2cb1c1e538966d04f -:0005f057a518500a300eaa89276bffb7d8c035 -:0006004f7d1842e5768777732464068e2a220e -:000610614cbcbefbfa668df7011a74354a6362 -:000620c168412772c3d51d786cdd9655154651 -:00063035be61fc65e061475d9333923ebe72bd -:0006403ec2e969d9715c9e732c5e55c1aeb518 -:0006509b64bed1a9f021972123482915af72fc -:0006605d5749131d64ac5b6634fb6a4400bba5 -:000670cdc8165465b979fd1119b2e4d7fde143 -:000680a939dfc44945f10258e66f513f8775d7 -:000690ccb6aaa8ee0a97efae528eb502643476 -:0006a0040733af1b883645ddfb97687daca352 -:0006b0f7b38a301870a76961e17f81a96dd2d7 -:0006c00c05e254fd8e8aeeb7ca269aa920ef3b -:0006d076dc6e0bfc12980276b086e5118d4e75 -:0006e0fdbcb6f24bb747c3578b1d946dd9c8f0 -:0006f0d422acda3258249490a59bd66e18176e -:000700e3de8a9d7a364683d54533fdb7aa069e -:000710c5c143c8a71179aabd342e196058c1b7 -:00072074d5fcce2a7fce2ee373490d1defd78f -:0007304488dab4d7cf42053ff781a92fa597f1 -:00074064995f4da4e84b217c38f7031603ebb3 -:0007503d789811ad11c25e898cd808f6107efe -:000760bd69453af64aea31687b3faf136c1649 -:0007702dad809df0e3fac3f74c71f286a508d6 -:0007801b212661923a8a10c735fd83af8020f4 -:00079055b54c62c095ac406f6f2fea8296740a -:0007a0ea451ee98b8fd4c73212731d9ed7b3f9 -:0007b0028379650dae3ed68030b4a9162c7da1 -:0007c0244d2619ec663e37a0849873ba4deec1 -:0007d065150964f5b38c2f9f0ebf252d009f6e -:0007e024a21f9b91cf2af63701f6ed93812dd5 -:0007f0bb38539901216c0df23e58f93ca2033f -:000800ece11104a3cedff48359f8c33ce19815 -:0008104fe6ad5f4fe2a895ba434bf89828e638 -:000820670ca39dd7c7408a65138b39530d42f1 -:000830593e9c406c49d5bbcf5228712b34d332 -:000840783dfd1db9eb325ca894423e326abf0d -:000850144607cadbaa67f680f02c13d6127fb2 -:0008600ddfed4e0d4b84ef3691a62e90dfee2e -:000870d488858e9e755fbf5bdf2604dcaa4d6c -:000880fac7d4f2045adce3dece213c2d469f49 -:000890acd6876df80871cf6d970480d9570f60 -:0008a00a53a3bb29b79e0dd640db2feb241925 -:0008b0d44e3edfea1a04f8b715bf74a5f2a8d5 -:0008c0cc0be45c582b5f19dc1829e1ec1d7441 -:0008d05e4021eda4cb63a625732999fd6b5827 -:0008e0518d65df1d63ac6c57a860db6d3b5245 -:0008f00baf592159a69895101b88f20a8f0fc0 -:000900993728d32dc563b15fde7dd64c569861 -:0009101b71253ff1d9790203c8bb913dde02d2 -:00092067bc755b41e2d44e22e7a87c784a7676 -:0009301ac0c27b04a67883d65b46b441e1a957 -:0009403c5dc39c766ace95850e3b568d96d006 -:000950da65d2813f1f2970faabdfde89b5de4a -:000960c038abacbe05c420d2ff98d7e50619cc -:0009708f8f24555540388ad8912e91a5932747 -:0009800e6fe9bd53428c7bb61909ad8fc2cf4a -:0009904a218e200501e950d781b8a8ac4b0523 -:0009a04e3c532fd8f24b2ba696d8144aa6a663 -:0009b0fac88c1ac0a18d6f1aa3496c72226fba -:0009c0e9e21447a2b5cb55a1c706f273b3ed9a -:0009d00fbf07fb773529294844824381a5c20a -:0009e0f0ea127a38f8b2a5ba9268dcec3efc26 -:0009f038e71a2969d447a9bb78e72235ebca89 -:000a0052f43fabf3d931cf7a1168c5b71dea43 -:000a103d46c033c1569cf3bb494d52a564e4fb -:000a20a43e759434165c379e942f30191cc71d -:000a306182744d41448bb830ddb21cafc16652 -:000a404264be08ef193299512f88549ea81cbe -:000a50cc0430aa543db8f694a102f768ec1a59 -:000a60d370de30eed20de9cdd54f45f068d9cc -:000a70ff724a07c3a153db86c76ff39d8cde74 -:000a80cf3589e8c590fd51f6e9b581296f7692 -:000a9014f39d7b57f631134e5aec51e09c6914 -:000aa0b8b3b29233a90b8d7b97e31fb1cac5d0 -:000ab0261ed5144f8b044ecc28e1b2cf629bf6 -:000ac063a714c96d5c2449aa4b8b859691affd -:000ad0fbd6da827085fc29cd39ae3d89eab9d1 -:000ae0c86a1e9f67b245a19c1cc80775249a8c -:000af0beed8ff967e830b86f4cd82ee1977c4a -:000b00e4761c8c172a62c12f5f0a8880d0e7c9 -:000b108973be6832cb3772c426d15e7ce8c6ab -:000b20a880d3638a55118aca53035be23ddffa -:000b303a1ebeaf3f67021d0a1aebda7595c8b9 -:000b401f6e9b0c20cc1121365f0c3ce3b75434 -:000b50c9d8e1348b6764c1d3bfa4e55687d991 -:000b6062f3c4f15de7fe6097d97baa83cb4dd1 -:000b700d91b7776d9f87fee635650b512f8759 -:000b8086ed6c92d59cfc45b69b976e981e28cf -:000b903930c4ec24814236ad51d7dfc04698ce -:000ba05f77850a94a112bd2f23bb67c00eef8f -:000bb0144da77af58d2404d71bbba7140b7e43 -:000bc01ae8958d69ae2f6e0b8690fe3019fefb -:000bd06f094145d630ccae311cf8c77721053d -:000be0cbde9ff32fb3fcc6829037211309399a -:000bf03358e41c99df0e41b18917758c7caa35 -:000c00dea70933b85d0c9f5e0096e0104e76d7 -:000c109f4167fe3d4f73dace9e3b16097ce81a -:000c207d391ac391019861ab3b7a55d9015fe3 -:000c30380c336a6a275d81024052621bedca15 -:000c403075d2e634be90992c2d741611af4f16 -:000c5021ed4a005c50f0275815fe3dd9658b9e -:000c6080a3b6c98811ace1108b9dd9f7b9eafb -:000c708c505a366f47b81fdd6b5e19d0421181 -:000c80cb86d1e6f3e19776d3a4437320df9403 -:000c906e4ae9614c6c8f489e90a9a8ef889b54 -:000ca0864ea9d4b706ba5c8c247619d4b30557 -:000cb02e3070359938442ce0dd3d66b9dcecf6 -:000cc0f85fb618d9644ac57d2cb36cc46bd3de -:000cd0bce14b479e55f2fbb6dcb00f63f79c95 -:000ce02d0b2f46824377114e4da4e06656b03a -:000cf07c3088882784d64e065d365e271a580b -:000d000654563e2b70a2d99b15b87dc8bcbecf -:000d1037280a8cf7ab34b404d4740a768eb20e -:000d209e0ed752b08dacfb7625bc7968aebe01 -:000d3016d038c91e019d8298d4ed60f4ed224e -:000d405f4c145f102169b523bedf9200986744 -:000d501e3632737547ce9eeefea0f2ef5299a5 -:000d6048442acdba4376685daf1837202a0b7e -:000d70b81a50d9d22b65143765a0e9143e5ddc -:000d802f765b6ba722328894c5abe5abd6fdf9 -:000d90e3e98a96a1f48cc33ae421b2ca9635b7 -:000da0b3008c57acc8b32272748f73f425716c -:000db018d52d80f8337b25cef9ded424bebce6 -:000dc018b2543281af4a571e048f22e16537c4 -:000dd059a5e765741466eac8df46f2939df5d3 -:000de0b8262cc4180092d1ab61b4367fb06fc3 -:000df099121c3eae8856ee1492d5e121e8583f -:000e006966ad84eb27bd0663da9c5634977e51 -:000e106e00a27f5f37e8a6ac8f8e22c7ccc84a -:000e20be997b0047242575dce4de4077abfe49 -:000e302226cd1ba992a3fc29ec669945c7f6b1 -:000e402de9b12108cc400c7d30071e4fea75d9 -:000e50e38bf68cf8a8c2692d0688cb21b81979 -:000e6046ec7fcc0186d8b6f27c5ca8ab2b6de4 -:000e707083b0c635a986fc63c5b2fae2fa2538 -:000e8079ff5f6d119cf338b3e50c9c6f5ec236 -:000e909a6c863676de32c2b454860ed75fc79b -:000ea0b285c3b6f915efbc3e14a1cdebac75c7 -:000eb0e0bd12cbe0f6d8300000e2ba153be07b -:000ec02d85f60a185b4f7abfeee9f0c7f98a6a -:000ed057fe1f2bf941cf2226e2c96bc46e2b10 -:000ee0da2a1920541480da8606be92485b5344 -:000ef0ae1a75cb9d8234db62039a174083a893 -:000f004770e695628fff7222bf48fe00460c8d -:000f10e90ad63fb9f7bb7a4f7b05bf903923ba -:000f20547a67a233bfb54d31e8ef62170f85d8 -:000f300d9d262d56ea07ef7898071eb0592ec8 -:000f40362b46dc3409f365ff5c1c8ad3ddfa75 -:000f504a47be5ecb1bd4c35e2ff8ac91d6b4c5 -:000f60b997f332f6a450d2e80dcdbc8c682a3c -:000f701e927a459944991b8580c22db3da9c1f -:000f80e35491b0aa846fe74011ca4b61a25a70 -:000f90616048729331a87b3f6a6f4c7959fd23 -:000fa0f5c65bbb764ed15278acccaeb8c9f693 -:000fb0fa932e97d8dfa353df452a319526a2cd -:000fc073d26c00efdbb427dca2d7991f52f469 -:000fd004b0fd3bdc4b304f6428d32d33078ed0 -:000fe01f418618ca7d2c624b8ec5db49f59405 -:000ff04d2eeee80fd5b6151bb786dbe19337fb -:0010004b5f25ae25abff816cff39e08a6d54f6 -:0010104564ccc57a9a79b1f306bbd331af25ff -:0010209d3e3579c890c8e9d58cdaa714bbd151 -:001030d10a76ebc3aaaabd58c8fc3f2b757297 -:001040853e31f1bbb0da3e6f7128e227519750 -:001050a75e1f3aa2d089fbb1ef3533b759e7a9 -:001060fcf5a5499932592f32fdacae9c018b83 -:001070b922c6ac5482ca82eaab0b9d7a3f4b96 -:001080ab6a8cd012af360e1f5cfad49932278d -:0010901f9262d25fe9ead294302601012236b8 -:0010a0ce130994542bb3fd2f04a2ad30e1d7cb -:0010b070154974955bb10cb2d4ed3eb1cd14c5 -:0010c0133546f6b603fefdfd1c4335b7fc71cd -:0010d0829e52129da280630aa9d63308a2b8e9 -:0010e0d4e03d0a83a346d2c3d0a48689c731cb -:0010f067b8bd5fe490742566a316b53e27c2fe -:0011007f4494e09acb9d79d100e74ab1d56999 -:001110ca79f7aa60b1ac8f1559132ddff57ce0 -:0011209329e4f6aa5d2eeb8ea7434f937ae1e9 -:0011303d40ce21b68c7f2c2638e5262642f42b -:001140aca1dd33edfd392431e940afe288d061 -:001150053d577a1d720672fb0f3d31c39bbffc -:001160a4cadf4c6b8fba7ed67f0547b6272451 -:00117059b750b17406f9dd967f8ab0f35b055c -:0011800dc7646d4584c43a079ed121044b401b -:00119033268dfa15d643040fc0685e58827186 -:0011a03a726a5ef512125146766f6b09023fc4 -:0011b05658e069e8d3381a5236123793f277b1 -:0011c0675f10a64e49c762cccd02e67004e411 -:0011d0ac4b9be8d1f5388f55666674b7bf94c0 -:0011e0f4767c4e8b7a330a8dd151171ebea987 -:0011f0c3be81c06ff092ee6a3d1905d4b4b6e8 -:001200ce498a9122b90f67ed75c0bd811af97c -:001210da55c6b92edd0ebc9d096f840e205c63 -:00122087097639225de047ba42ba9ba9b2e390 -:001230ca68b3b41eb9ee9397e990597e8f3b77 -:0012400b3956fdf7930574132ef8c03a162028 -:001250a661d73eaec59cc315a9aecd4800a762 -:001260d2d4372bac57cc62b016b3ad12cd8fdb -:0012700de4a9d54f60829b6fe226fe56dbcb6e -:0012808c6b3b41f4b34fcc7edb8a5d7321b7f0 -:0012909c8b3ec2a2d734d83b9c980d033419a2 -:0012a0d4c3e1c838d69ce11ed5e426d4100b23 -:0012b0e7a5248dc36b28e21aaccbbe0c969873 -:0012c0c6c1c38fa04475c119b066709159bed4 -:0012d06cdd8aa701cc98781d367654ae7a805e -:0012e032aae571b19f51af7c4473bd29dc10ef -:0012f045fc873c2def1a4c8ab489f2946d3a86 -:001300fa4a5c7fe312d955118b34449428dcac -:00131069b437cf67bbc951b1dbed8199dce80d -:00132018df9c8edf216578d32b7a9666a93777 -:0013304fe9bd25a2454133900f3b6f787abb5e -:001340108e92d819f198d75c10d645a18b08d7 -:00135095181ea1711a9a1d7710cfa84c7d2114 -:0013601b627d9f9c4121f1c32572d3c840e49c -:001370ceb2c91e4c12afc2b7a3c648e2fd1de7 -:001380828dc1e036983d43248fc50688af8150 -:0013900488b6b9d662e741ec4bbac72d113a8f -:0013a06cb347c7ca814b5ee4aaa04779f2cf67 -:0013b0e9f9b0a2fb37f5781b3ba6b57b9196b4 -:0013c0caccca2a5a5a323dd75cff160add3db4 -:0013d0c377a202ee4658eb8fed50c4ae3978f0 -:0013e05152ad1e5bc5120a8564032a4264a7e6 -:0013f074f35ed07a5e9f24aca98e66d5614e6a -:0014001d196725492cae0bc940979fc842d53b -:0014105cccf7f9dcc1d5551fc3c625fd9e392b -:001420db582c8aeb4d07a76a5979e13258b94d -:001430d892219170e1805f0350d71fb8c0f9ab -:0014404de1cd647488c11195b28aeca9559dfd -:00145049915dc8e55c4dac6aa0636fddc2a902 -:00146008578740e2ab10c41c4593ed8cb92e58 -:001470cd851e4fea85058a579976ea008175a0 -:00148081c971220827eb4d4d6de37eabbdd7f0 -:001490e39ad0750f164884e8ae9a1f3c9603b1 -:0014a0f9635db38be369b3fbb4cf76e3eb9095 -:0014b0681be5386040fb9febaa69929065779b -:0014c0157d57debcd11eda897b370186c6c161 -:0014d08d91723f85467a5362796feb37fcf0d4 -:0014e064051e89dde8269ed8b54c1a63f9d919 -:0014f06fe9b964416007deb31532e31beaabb0 -:001500ae8bd926adc38c87c575e0d14fb80a7c -:0015105bc437a410c80e5afbabce573c0b69c6 -:001520422114f74dffcc5416aa5af2edea7be9 -:001530c5ec86b4f435304a9823a36744680733 -:001540e7d0db49778b5c3cd29a0c734df5e792 -:00155052896a59ae8a424615ac2f76a27275cf -:001560c9cbfa80d06f4484f43b8d0ae9d0a82b -:001570581c3883c543acbb45b6778b34aff19a -:001580753fddbbeef3a7b174e7d70fdf38b1fe -:001590eed9e99488766c90773185447ec2397e -:0015a02334c8496d500af1372ec1d43392ad69 -:0015b07a9d9224f2e0fb4bcebe94dd51a84bc8 -:0015c0c16738967444cfc5116fac507c44f6d6 -:0015d0873ac9e5ab5f0a8958f4a990cd27cc1b -:0015e06983e93ed8f5de85fe2a1807f69cf926 -:0015f0a1ab2a42c98b5da42d98cdfac12536dc -:0016006c30856103d29153c9d27f1538ab937a -:00161072433057f156f8f90808bd9b326fe207 -:0016200a4c40452c35c3e03707fc25296f9bd3 -:00163092ec1e8f3996a4aef738313d10ec21f6 -:001640621faf66f14bb1413ed68cece1975f36 -:0016509430551a60422638b28d80b08a2ed3a5 -:00166044845b54902c518fbe9b92b2ee8a3dc6 -:0016705d7a5314bc4737e2b2543174f259815f -:00168027a5514b132f623f7044c0c02f293290 -:0016900f7ef9793bbc419c21eed0d35d2e1e4a -:0016a0f04df1814ff16595319afa70234a4095 -:0016b0a01cf89a20dcdfb3028e8985140a0e23 -:0016c0d69ea480b5a4dc3b95f7b7e340440798 -:0016d0fccb9a801044ac82aa75c385800c26a3 -:0016e059915f0cad386070f4eec77303360c57 -:0016f01019f563dfbcae9c87f45fa97465d6e5 -:001700060832d77a64c47a1a5eab2729709b54 -:00171055659198190a5b062e3d2419b490b4d7 -:00172078ffd33a8097aa28625dc6df4740a215 -:0017307b7ba8c70e5b6bf645ba797b1571a281 -:001740de05c300c242e30fe81e4d868d3748b1 -:00175052aeeb115034aeed0fdeca2a79adb585 -:001760d7a8d63124c656def71bc106bd2ac153 -:0017707dead7bda5b06f7bfa59285fda6c3c1b -:001780a7a935bb13d35ebb312c7099e6baa133 -:0017908ff7e7abcca82c5d236c2f16689554d4 -:0017a0de931de98029e530fbf0be1867591c83 -:0017b0c4aa3c5f19260774a48322e85ee84c1c -:0017c0ce9e4ffc25d180c2138d6001cd69f9ee -:0017d09d15c6c5e4150baaed3345658a03aace -:0017e0119e16eb3ae53e1579b8ebf587dce75f -:0017f077b284321c2fdf4694707a97feded757 -:0018003e2ca609736a6323b9e17ad6d6273160 -:001810f8408c3300471b25377bb5046232330a -:0018206a65c71a51846eed645d0349ca3a64ef -:001830c17f79734ae73b806f9f21ff37f9e75c -:001840dad61050855dc380ff1ea2b8f9be92fd -:001850be2ad7899039eae3da13ea045f8c64de -:00186095e1fc0bf5a03d0f9567b3632c0ab778 -:001870edbf7d097c95db0cfeffaa4604731bb5 -:001880b7a1d37cbbcc0da2a75b59668702424b -:001890fa756aeb6f3d8d28dd5b85e073bbf269 -:0018a031a11656c11e8c46a59f97741dfe0732 -:0018b060ea70ec85da9301d1bac4163c72ad01 -:0018c0f7c1d68d792b4219d47168022dfbf128 -:0018d08fd0aba51b973d0722f263a521aeb89d -:0018e0e1a7a86fe8299cc844cfa3c0be648738 -:0018f0eb4f6eddba8b11eba5773d690f58e3ae -:0019005d8de4f746ed07dd09c568c60fa427e7 -:001910079f7b78dc8c576381b147af910b83b5 -:0019201bd936d96ee473de76e1e1e09a766434 -:0019300928f214e41ab6f3fd0e381ea05e7379 -:001940c934cad9765a237175c4856b9f7d3d85 -:001950a52afcdb00fcdae31c2680ee1b646741 -:00196066c656c133a50396126910ba9018a0c6 -:00197062620bf5f4b3f8c4467e1d6f3603de10 -:001980febec5744a2982193e274cb2eed46d34 -:0019902f782ed0f2be92d3a37ee13fc7cb9bac -:0019a011e06353a29a9d54ef199840f9315d4f -:0019b01bceff44d9bd00d5053d16f3096f72a3 -:0019c016ae1d1432d5312bdb9a2de41145d878 -:0019d042d5dad67e2229eebf90b1f152c416ca -:0019e01519fb965601e2e064cd97444f91264a -:0019f0c46ffe9f73b43b109af9fe9b3347cdbe -:001a00b2d675e49771d8edf16ed509e3a21990 -:001a10a6e7cdf1c3ee3805d4f4b160e3af7efe -:001a20fa89b42ae148542cfc0409b583cf13f9 -:001a306945deae2c8b6aa04fb0e360bc3eabad -:001a402dc645bb2831c9017a444f5bfb352f42 -:001a501f06019de2b396b3f92b60115d935715 -:001a60ab0a079061c79c7270237fd0f40d21b6 -:001a708342cc305e5a38000271c9194e5b9bec -:001a80b52441cdd3d2ce55d76ce45fab1ba1d6 -:001a905e5984e90014ecf39e5b91093d406bad -:001aa01ca969aca073a742a04a136d162b6e58 -:001ab06262f7106428df7aabc2edd84d6be234 -:001ac0d726b4468ffb0da5875321d5a3b3040f -:001ad0c3fa920251fb57bc4e432d8fdf4aa15b -:001ae0397a710d4846235e0914e19182b14bf4 -:001af0db97eb418772c66de89139787ddbb660 -:001b009b576c94d5b7e4761b45492f2ea28d88 -:001b106c2439c6b2944b9d0e25bbbe84d3f156 -:001b2014df857b38783e453b88868b72c5505f -:001b30777ed8f5776e1d807cb9a78901dcfb11 -:001b4085daf58265ee4e3dc846d9cb20435f10 -:001b503b89495555ade1a496271d92b3895652 -:001b60c0acfd24929d0e024707effaa3c21405 -:001b7097d711efe2590be4975438d8c730fc67 -:001b80e806eeaaa538828dfe10a97a00007e45 -:001b9086907fe5d57200b3d0a3157b591d6482 -:001ba0d43fcecb74342525d3a3a98157b9e83d -:001bb0fa4227cc21fb964cd5b18a0e134e1233 -:001bc0deefcd450eab37c9480abccc3d4313b8 -:001bd02862d4f8db1385879f8ce73b3023ef87 -:001be05ae9c051ef9dc7df88939adfb6685366 -:001bf0798bd03215a30c3c519cd26ad65d9376 -:001c0085e02907567e7cb6dbb04044b3b59ccb -:001c10ec76d03bdf45d404db57b977008ec720 -:001c20683b76d965bed2bcc8128f06062f3743 -:001c30d122e73272cdf72a3b719f237eca698d -:001c40a7641d386a2098283f32b4d3086fa820 -:001c50ee4f8e8cf4f97f764c303828dfe278fe -:001c607e10e05d6d7a101a71ce3b8cf673c817 -:001c7020da51696b079cad2a14098631b9ddb4 -:001c804e3597894d1de8c578e41eb20e4eee26 -:001c900c62d8b16e397942ee542a9219f45a73 -:001ca0ff1ea9d1ba668dd00995bad09ec6e23a -:001cb0b327f4b8ed11735002ca451e2f5bf17c -:001cc0114987705ddd90c66809c68706bc0899 -:001cd0a484770375e1e0592baedf316a2ad354 -:001ce02d30d55b9a080ab6f3a4b132c72b245f -:001cf029815a1a8d8cb043deac9ca76bdfdb59 -:001d009991b60bd660be2278aa9e63d9071d30 -:001d107e5386a7235775ba7b15c76aeb93788a -:001d201228aeab8ae3238d8871651d511d3c26 -:001d3038bb0c8496ad8316854d2a013bd8f1e0 -:001d401e37f8c0ce8ab137432481cf3d45c973 -:001d5074645e262919b80366d3736caf4d8aa2 -:001d60708caefb59897c2893bb27864f6ce422 -:001d7099cf44db7b8b54bfcb5cbd154ac5a706 -:001d805c4d5061f6539d2cdd501c2c17a59b68 -:001d90d6e876df80995921de0c9f3b296c47b1 -:001da0b9cc6387a61520d130240e672f9f2b3c -:001db062396f638633f134f2ac0f10f3d1aa2f -:001dc0e0c6ac45314dd748f50f378ede752236 -:001dd09bca2845cc730a296605e95ee0eb0b37 -:001de09e05bc84062443af1c68a7b548e0767f -:001df0ac1390b937f24562d80bc3bb7e325ad2 -:001e0018e38121fb343ec74ab6ff7301f38d8e -:001e10896d58dbeee1a06e3a19126964d815b8 -:001e20e24c87c543c85956a842d49fa235b904 -:001e308c253ac6a7b0eafb614c34ee7a3cb234 -:001e4031216c2a8e9e98286b1c11305ed1352b -:001e50b5d6c6768ef465fe43dce73f173db01b -:001e60fef4b03321f0934c2789c76b8a1f1bec -:001e70197f70a438d4c5f38c1b5c42a488e071 -:001e802452ea999b36feba956e1344a779ed37 -:001e90217c188d415ad8e0fbfd20a7c39c1301 -:001ea0d99cbf25d8057574c2839aeda8771a4a -:001eb0cc335d9917845e2dc6840123cb1ec1bd -:001ec0c3b3d0d60f517247bc8e2f38f9cc20e9 -:001ed07669c5bdea7b07e7d625caad561f8bdd -:001ee0492b5b38b1ba611cd43b0c73825e739c -:001ef0e1a116864c798cef1b9c4a99d9416b91 -:001f005f7c8aae9a021a6f2418ce3147b39f0f -:001f108502a35a41e31fa1b03d0d70609d38e9 -:001f2054e850926ef1e74c4ca690e6facf1320 -:001f307d520b7404cc18fe29a2f873839ef938 -:001f40457707c7a8e713a75c377baf838ace04 -:001f506165bb87ff2ed1a3ab702f727b2d8edf -:001f60ab761288e4d1b84a55eddb54c32792b0 -:001f701400b08b24e1dbf6ce49ad20f8308deb -:001f8086c4b6f491446a1e823004a22bb4b61f -:001f90d7d5c50e9fdfd577e977d14ebecadba1 -:001fa0a26cb881b2f443c449c06cb878449e82 -:001fb0000eb6b7ea22d1a42936a6a71b5abcf7 -:001fc03d45c646d133bc81ae0d8e8cb96d2237 -:001fd04469be3654159626084bd93bdcac310b -:001fe07ff38f4cca4b867d5c85b9b99b4d35f1 -:001ff088109645dec6a65b3bc5f03a5afaa101 -:002000c4f9a1dd7e40e4e9d983d8d309ae2b5f -:0020104e665be82198579c000ae0ba43d4c3d8 -:002020005fe5580bf4339bc60ba5675b23a4de -:0020307c71a2b4c1a661823c6d9cfaf3f509f4 -:002040c81e153c6bcad2216749b2d894da7cff -:00205063b54bbf832d3e1046821adfac5e3286 -:0020606735db53b1afc57411330feb5424827f -:0020707db44a29137020adec5c7e0787bc4d76 -:00208071a0795837818e4e79035c287ce14b62 -:002090e08bb79a9ce7d2bb9cad009e50c94a8f -:0020a0a55dc6137ec115e0627000049bdd5bd5 -:0020b0db98c02f1afc7ae980536a1e9bfbec22 -:0020c0570b5bc9bdc71eb78861f3200357aff8 -:0020d091141b666c8a7231ba7093b530768570 -:0020e0cebddea76f461d86d94567e9088355d9 -:0020f016b4ba7f559817d9bdcca1ad4590dfa4 -:0021008542f4c4d674bb04b5b9fcedb5145da2 -:0021102834898c05aa7f4ee9a74fc2dc876133 -:002120dd6ef57be1390ef1fc2f55b7ee257550 -:0021307c3dde152752af5b9e8a6089562b305e -:00214088238749ccdf4f4cc1be5a0170b1daff -:002150dd773e7b49ad6a678987bb5dedd498eb -:0021608322007c438a14191b69c85aff1faf2d -:0021708f2b3ec6049c8bdd7f018d13cecc3b2c -:002180ff5de11ab06afd78f3491f26af2c8a8d -:002190559343301bbc20775125aefebc9053d6 -:0021a039360e68cb42323105ca729bd08383e1 -:0021b0de441e490394e123a700b22544f4854a -:0021c0de8ec244dd9d7e6f616ec201bd0a902c -:0021d04eb24b4f57784be0ad485ad221e6bd49 -:0021e0c926d346a2b4e8720dba6406546f5db0 -:0021f0fc5dcf8a3af26034240eedd061b47831 -:002200c5236b3ed519f82a877fe64db2099ee3 -:002210966a03a7bd171ffcf8db6decafe49776 -:002220df41c772572931b77ba2e8ca5ceb6e8f -:0022301638010826bb45c5449c2343c52e69a3 -:002240441984ea2f80341a14d4091cb245d2d2 -:00225059d832d93f5c7383e7f9ee3b6f3413d6 -:002260bc3cc1c2e992669580485b8ab9e37be0 -:00227076b26f5cc148dc27210e33b707268b9b -:002280b08215aea15797af30d6f32a98f58035 -:0022909b0f3bfef96061d39ef0144b781ca068 -:0022a00f5bddaa804cb8bf99066976210dfa4b -:0022b09dc2de7f8ad809ed8079f06031114b8f -:0022c007dcfcb72588c8b5d54e46c83183085d -:0022d04f3407842f318b91027a6582b314249d -:0022e0410c1f835b5b1e5e76120d959466a45d -:0022f0eba7225369c98908924d7b7a90adc477 -:00230027d0c27438c4570fb2b065075e80bca3 -:00231030e727c37d19dd872fd83dda6f5ac8f1 -:002320f7482fcb79e1b8fc2c8c281392f5e4cb -:002330e384d1e048f087a1f91f552ef6b95f0f -:002340da9e368a6220935c6d23347aa283fa29 -:0023507838faf0e48c9e0fb87df6ddc2169bf6 -:002360a26dc81f40e0766465ff584a401511e8 -:002370e1a2d105e443e869da919473a07858cd -:002380ee928face428e6d9d361460b76648824 -:0023904fd8b02aa96105dcbab79797d4008a09 -:0023a0b4ea6ecbf447d896200ec0d46757b697 -:0023b02555f735f770d630893d5bf930d656d0 -:0023c0a75a4e2f5dced66ae1fc8754f5dd12ba -:0023d02b1195d2a6ee765737a1b5046db1a29a -:0023e0cb3fb234fc4547702bc9b994a12fd8bb -:0023f0036a71c2daad17d68589d738a73e7075 -:0024006dd448731893111f511445b2312d8912 -:0024102a87932408e7ed5cd14a6d7147166392 -:002420be4701f20fafbd7d5e6f977f76732284 -:002430727e682f57bd082200cab06c10c02b76 -:00244002a021bf43dd3d8e8e87eb4cd1a0799c -:002450d84c4db4fbebda5c6377e916b1960f93 -:0024603f94f854c186e8eb56a4dafe806f1be2 -:002470b2186251ff9e22c5824438a8721d9e77 -:0024806dc5988986f4584051e354d74fc08e1a -:0024907ab48c59e91242e98c9e4cd68ed874a4 -:0024a0b8b388e43a235e13c1c19d57dead9c7a -:0024b04e93b90b1af0d33868d6bb2f915ff345 -:0024c0da60357118b45c1999c4a094f4687013 -:0024d06f61715cd972f479f1f823f871c02436 -:0024e048b6711073ef21724a9d3dbd3adfa9f6 -:0024f02d28a1950b0fe46bc2315f5d29cab9da -:0025002810f2c64acd8eca3ea89983f715adaf -:002510feca5485ae680a6e3e4253f2db5c04e7 -:0025201e969abafdead087c3c3616d0b1466c2 -:00253003d4ed14f8e5c945e3fa36147704706c -:0025409666a9b9c9c0d0df6151fc14e7924e91 -:002550c4c7985252b695e568813da24acb9750 -:0025609b1be6e4e1974262a46cf92d8636beae -:002570358ae731e4f67f4b1813bbac5ec5621c -:0025805f7f628942342886a9a536668236258f -:00259031c0a7c9e5ad3132f468a61154ddf711 -:0025a0ae762c45ce10461b938fa24df1e711e5 -:0025b0e48015d5ef8ed165d2ced5a1b7b20359 -:0025c08d6bf12a8787be54431032c39fdf618d -:0025d00fe8de439bbc9d952aecf9bc16ef5da4 -:0025e02f4098578c18329ef035ba0b773d2d6c -:0025f01f657c066ae2eee207386f86f855a575 -:002600fd8722b6f1f35cb18b76fff8171f643c -:002610b6c5b16369fb549a68cd72e96fe97e05 -:0026203ca9592f7c2c6279089e16c8ffe868f2 -:0026301e583af7b88ebf74d2a332fa77875611 -:00264020de37eccfe4008934f428c174da0c13 -:002650ec872d070e2660e0557add0be45700a0 -:0026603800ad60c855033933881e11124d5e71 -:0026707cfec262c67646cb226578fdbe1f0817 -:002680b2e020011adfe61d003e1f01980e1df6 -:002690bf0f477f9dd5005752bc15cc98f69bb1 -:0026a0e1cb3ac4f4d5714c1a570ea2d0fb3495 -:0026b0d05f65c97dffad707c224ce410dedcbd -:0026c0c2a6aa0573d640d69088762513e79a30 -:0026d0659a069f48ce68882eea005061d03ecb -:0026e0e43aede843649542ecbf9c88e1f1be6f -:0026f037295da34753a1acb8e1d11007f535a7 -:0027000b4d9478fb13bf2972db1c33d15e7502 -:0027100968ab263f09fef6ea29f35e881ead11 -:00272098ca3dee8f69fce6c1d426d8a670fcdf -:002730393a65c835a737a43d3ab15c5ccd3b9d -:0027407854b4f55ef749bf6f4fc4a250bf45ec -:0027506b889e1f35f52ef05ec5ef9900aac49f -:002760a5491a5de50d10103557c1dc02d0961e -:002770c41238b6f78f60b5399c2bae066756a6 -:00278055ae19b4c0c9e96a47c21f0407040276 -:002790ab84b3edddf418296e57709ca12a17a5 -:0027a0511cc9b6d6569c9f6db565d6c70f9cae -:0027b05436be8a9b226eee2ee6d994bba5f130 -:0027c090a2528b22bf1362bae0598b6993c7c7 -:0027d0b88b3ce305faa7a4433bfc77788d48ef -:0027e0cd8d39ade8d54e41e376cc6f43250782 -:0027f03c3bf13adb89d8c7f4273db1aaa61f6b -:00280029dd2154145d4fc1e1be49a92076086e -:00281028a99b14e42870913d9a8382dfed4f5d -:002820a0f24a54c8056066aad8acee85a89c0c -:002830b7bbf25da69aab845e7f7b3929214675 -:002840ef5ec075d80df506596d3568933e5706 -:002850d6ab486f7ad81619cdd642dabce00c34 -:00286075caf3756abbb52d154ffc4afd5e7186 -:0028705a58e8e466dfbf2e0b76003a3329a78f -:002880b5ca1822b21f040130cebb90acefcfa2 -:002890b77967782763dd58d3156c36c230df71 -:0028a077d7930d7ac87c7b55f6f00cc5bc7d5b -:0028b0fd5a16d4fe4a279c183f7432266c22f0 -:0028c015d5ee68e9400b911f93dcc055218c2b -:0028d04ab1616a74ed0e45cc97c7ca22131864 -:0028e0c1f343a57d4c4d641c9630fb12223b53 -:0028f084f3b2e13dd034acebc829c22bb1dc16 -:002900141a4e487e742c6f28a2829c5c4adca0 -:002910a8584d0d6a75485d422ece53906fc369 -:00292005474979c1c9605a9521dd97e7d42746 -:0029300544a767fcc64612138dff531ad1d6c5 -:0029407c2e60a1c7eb896661ae6f212bd26c75 -:002950df798bf94e3259e9e12aa74ba7f3db65 -:002960170d49c7179d0a75447e4da363f8d497 -:0029701b8588d0547667e2f2a31f705459f3a7 -:00298019ae5fb8c4d9a16865661407bb550955 -:0029901558fd280ef72e496bbd54f083bf3eda -:0029a0873609275de07aadb47dd7a41a509382 -:0029b0aa5c3199a9f2fef6de64b1d2b47003e7 -:0029c08339fa77714252cd08bc92ff9ba1c7d1 -:0029d020dc5bb6ccfac96c83fe14c9584eea54 -:0029e06e0673cc42f083228ea12dc953ef4c39 -:0029f0ad7ca7b495a51c08252e72521a765813 -:002a00fe9b7a13381d896b47cb49e5b098f083 -:002a10b1c9050030b77ffcb3e4e7be0358d374 -:002a205e58be2f127799a7bc706f0d702f67fd -:002a307ec76701a206967856e01450212c7cec -:002a40a452384343c806f5e732ce34807ceb45 -:002a5096499a37450627bddcdb1de539b5fad3 -:002a6055206db51665404b98a32c9407cc5d4d -:002a70c9041d1fff38214100afa3cc23cb23ad -:002a8087151f82a7f319050d98baf4fc026ffe -:002a90cede999fb27aa5b701f73ad961c0c25d -:002aa05992f10724652cdf401af61f02b8879b -:002ab05349fe050db3f3da158c35374b9b43af -:002ac04f1c4eb69982632b446f80b9f247c2c8 -:002ad0c66c67f8c52c168b2c1bcba84e6c7b39 -:002ae0f84b0ffe5450f811ea474fa6e4f6cb21 -:002af03c05b7a9d0270103e1da96e7a8f6473f -:002b00978cc2472025eaac1ec9bc5b5b544e5a -:002b102664090ea091446f8fc4550d60e1ebb9 -:002b20810a233df0be9ae85a06b385fd49172e -:002b30e824e7edead2e5bfb84d431ce3acc124 -:002b40e2b6d8517f1aae77f9c677727c40930f -:002b5082b1b778f2acd4b43d913c69934b2cef -:002b605c1d67804fa9d95e519e6311846d1780 -:002b70d62748ed0b7a5b33c82176d45600a926 -:002b80c25371c367730e46bce3a778a86124b6 -:002b908809dbac56352afe77320311046bb50d -:002ba0f93dc42522ce8eea95cc6b9fcc5e23a6 -:002bb05b81b1b5b56d945be25c9e4ca8ce82ba -:002bc0e6a5fb656641aefdf91d404a8b315485 -:002bd0063d7c9a1c83b9581050a642388e82de -:002be05943c648c4dcffcb26d3e657eeb2f422 -:002bf0784df3bcda61ed14ea0faa37f465a628 -:002c00194d1cb9f73cec1f4c55fb089828251e -:002c1030b8480807593bd04f3b748314c5503c -:002c20f3c137c5157db04cb5ea465b66b1f1f3 -:002c30211c4c796f5887a9f2bd7950660d034e -:002c409c452e4b9facaf39eea17fee6699e185 -:002c504632800048d8c1e9a83017a12c2405c4 -:002c600cb42c39cbe1e1ce5e17132f301efa97 -:002c706eb67b3ba0dce3a19d8e9bf90e3f8ae0 -:002c80048d2f7daa16ddfb0dc971036a584938 -:002c9084fba9f2a118f21ed2dedd9631577530 -:002ca071395e10a8ee4c9964c1dc677d8b3fff -:002cb0028213c4c8fa48f0c5f6490b15e3a767 -:002cc0121e012a2c9a1db51ec69364a1448544 -:002cd03c7130bcca05f08685fe2caf0d0fb4c3 -:002ce0d1b922c0b3a909976e12c806490e7052 -:002cf095b5b8829595e90b3dc973eaff021e4f -:002d00e3f5f6230ba275036ea516507f4cb3f9 -:002d1052ba924024316b61c34fba4112824623 -:002d203da493c818013fcbd05624571ea56407 -:002d30cfc3bfc54c0a769f317e961ad6e84417 -:002d4079c8b01d7e105598b4db77b0896489a3 -:002d504e28a8b846740e9f087436ca9f3ee8c6 -:002d60e523c5609e243ac742d7c1692b8f859b -:002d706d71d1622c75cd2d27d9686d4999e61b -:002d80df3604038869b4c002822a8b98566c10 -:002d90eaf0af96613a8afa7f7e6cb49917e084 -:002da03a9f18b5d3c50e93329ba988bc15b716 -:002db08af923fbae2cf01612dd161cc1bf84b6 -:002dc07d3d4751fbb26ad43e94d3230542ead8 -:002dd025371cd10e1ea9f9596c4f2fd9526be2 -:002de078d3a4d1b239b0afdebfeec7483678d8 -:002df03f10623bb98de40348315d9e250430c9 -:002e00eda2d15bddb514098d486ff5bffa6f45 -:002e103c91064c79dcfbe7e3b5b8eafd1ad32c -:002e2095bd390c4c256ac776d663b39d887963 -:002e3093dbc38f1f436f7b8476aeeb34ba112c -:002e4075173eddb6a6a1d1ea983f48cc56345b -:002e50dab61907c21f99eef7bb0673b706fb23 -:002e60d7b4345560ae2afd0acffe01add3a8e1 -:002e7026ba8a6de4518c7fbb9196816e3e0769 -:002e805b2f27ffb34ce071f602717741db06cf -:002e907318a29930a708fa79d26af70374dc66 -:002ea0bc87c01393a7518ecb4e1a58106e3945 -:002eb011d70b113f3b0c898d0c08e284106daf -:002ec0a2fe3b4739ade79a89cf4a1477001d72 -:002ed049e5f6f89bc97b1d7d8f97df3b7efb33 -:002ee0a26d180c3cd9d54b222e22335418f18e -:002ef0fee948811274a0e112d0131e2b8cf73a -:002f00a01ef2582b3505f1dc2ddb9d510f8866 -:002f10b652a59c0a8d64e689bfe06a858d596a -:002f20aa445a8331189bb10bdb532fe0efbb1a -:002f30946a4499bb3df8c0d898659ebcdc8922 -:002f4036a86f623575af3e899e5bd4e8df6631 -:002f50b83cfe86b137f005f61964dac9f365d7 -:002f606692d31e5c0459477e7b90026d7c1dfa -:002f70301c1e567010aa588d988d4c1b511c21 -:002f80b3bfc3c34acc9ae2de3113113f8310a5 -:002f905bc43ec540e43b235051449d68227661 -:002fa075731efe5158fa6690b6a61b04a9a98c -:002fb020030014ea27df4514af71b91c9bcaeb -:002fc0d9e19fc50ccb7aaf4b757d08ea8c3eca -:002fd0d4cbf533c0242bcba8fbf5f1474e0a96 -:002fe0e2722e766313abcca0f67e1744c588b0 -:002ff00047b048753dad401bd1059f56702935 -:003000fab22cd1dd97c781dc503178dab2f284 -:00301083308fec4b4459799067d0f0aea63166 -:003020fb31b0cdc0c35666506355b1533d3597 -:0030303b95b174f4f517ea4bc1619575b938b5 -:003040ddcda7c3c903c14916f713c57bbbee6f -:003050cbcaca7a9704b59f3636085e2844d467 -:003060886d906098fdb93191e969760d81a04f -:003070350c96a6928e58f6860994813697f28c -:003080eef203456bf3ae201932327380717a1a -:00309014b26ff29cc0c69acc8e69e2c1c5f8a7 -:0030a05d7082ee2bc80a3ed94e76cd900bc623 -:0030b046209818f53a2c86ff53e7a4aff66c5c -:0030c0fb76d81d2e9e957b6aaa77559fcb1815 -:0030d0b9dc613593a0ab904e0cb2a3be5ffa47 -:0030e0908a0936d6984fe474e68cf03f21d03a -:0030f097562198073450db6639beff69b79e79 -:00310020dc3d08bb66ea981927991a75cf01c0 -:0031108de65db842dd0352d61b111965ce9438 -:003120e00e7a0b861246546a5dd579008f2c03 -:0031303cf58ce4a76ab422bd32753df11f6b18 -:003140661ee3e54b2df3b6de540c273162418a -:0031503043e17c9e2d86e22683fd275ed2f777 -:0031606fa05607e7cb0c23d120dce110413d73 -:003170dc16218f81ecdc578eadf8c4f478a717 -:003180d5cefdeb1661d80ac772e51e3d151d8b -:0031907189876cdff737b62ac2b0422b314e27 -:0031a045b27f18580d753b19a2c2b92e41f34a -:0031b00ec5e3c11bb463839fe5002c3d15f23d -:0031c0ba23924ca8483af302eb2e8efcf056ce -:0031d081d2cad224e05e02ec82796c73f9fdd9 -:0031e0043bc0fc8d2245470e8fa2fd6414e694 -:0031f0b6870f10750f7d948fd82192231bd0b6 -:0032007dd05b7c73d4ad7c986a381c0a2b90c4 -:00321073c97e81e28c63efc49c656764d9b5e6 -:003220e07e55e2b46e8d27786f83c35259b20c -:003230e6e5ae5533128bda48f291e81989127d -:003240be6c5cb684be826333aeb7c17e457187 -:003250c854b824de20a2931f355aa60b560757 -:0032607ca95aa085d01262e6f1af01165a4953 -:003270359a5527b29ba7f8926afe3511cd9d28 -:003280c23bb976c61f2fb1ca9b6031d336b2f1 -:003290158df327e15cd6f62bb434909b53f81c -:0032a05724a695502edda0cedaf8003aced2bf -:0032b0ee303bbe4244770a54ee695680210dcb -:0032c0c8ee990722d3b537a50072a81f577779 -:0032d0f0400e267ab69cbd227a64305754abdb -:0032e020fbf669894840580d3d6c28dade41ee -:0032f0172d6bbfd3107002b907346e0b176815 -:0033006787134d3b7b03ac88ec928753ef4f83 -:003310a2a69659cc7d6d556f745f4c8de158f1 -:0033201232329a5f4ba669d1be3d9e06ed7778 -:003330598c5626064c28bdf54ed55bd2964f72 -:003340491b7a36f5ad039c8a21df87285c5ead -:00335013aabbc74615a3e56d4059d5dd71084b -:0033602c06aac1bd2ebf07b1c8526707930222 -:0033706e59f8b9aaf097005c2ceebea7ee8b99 -:00338090273ffbca883684007620e833188461 -:0033902facce92e4cfa6628eb93a4f6caa8261 -:0033a0da3aaf72633370d0fdbac187a769f90e -:0033b02ecb7e88e6fe39f7a1ec148c37c7a35f -:0033c0f5933569839137785f9990ac8bbe0923 -:0033d090c2cc7d00a342277a453ea6538d94f6 -:0033e0378717982a4b3ab2ad55170ed5d245ca -:0033f048b374e6366227283255337ee03d50ed -:00340023a97c68e5c8c0510f76b1d88a3d35af -:0034100f35b6823c596e2f4ea8f65505abf4c7 -:0034200987390b47f15e6d6c0cfbcedda64c90 -:0034304615ff2bd98fc7bda1599669cb307ba3 -:0034409c316e414b92c11099064e808e840124 -:003450c6c23c381af36cb52d272c15a194aee5 -:003460ee45045b98142fc90cbe305572ae46f4 -:003470a84f3a3f621c06a0c053d154ce100641 -:003480338d58aa240a0b2ebdb3ff4bec832c68 -:0034904f023afa21b08ae23ea30cba88cb0f68 -:0034a0bc8872daf979b9972ebb9bc4468ab9f0 -:0034b0fb2d2000bbdf2ec31369599fb1fc8b55 -:0034c00d4c321a528ce9ae9d3324af5455d918 -:0034d0239dab34fc48f11e86b8dc0d31f57431 -:0034e0ee4666e38efd575bc0ce6635af2a4e17 -:0034f00eeb2c00eb7bad85c9d487fcd74ec9c8 -:003500bc15f42a6106f1ec5d9f105426b88bae -:00351069e625312852249db099c67a5e5aed7d -:003520979a3eadde42999808fc7d1a65db1595 -:003530f93885e52e7f0cd83d3d970fd0b7d737 -:003540915a74ebdcdbe155474f42fb972e5771 -:0035508ee8aee2ff98c2e1d268d635f147989a -:003560d21d2b1fc2b7fc5858b8dfca193971dd -:003570f0b6115fc9d9b7701c76a199e4ece11d -:003580a3c5779a2e3fe2416b0aa9bab37e6ea9 -:003590e726592a83ec1213fcad1861a5079891 -:0035a08497e30c5890f978a009068491d4c15e -:0035b09de63c782bade3153dd5389fa8fd9ac9 -:0035c060ef68cf7305729c4a69aa3584cef4fd -:0035d0252b5725e6113b78429fd16b99c7271f -:0035e046c34cea7eebfeeffedc999022834be0 -:0035f024e4dea7a007d7f5767fc87535e3b954 -:003600cf604b1041e62dd26a479997c4834a13 -:0036103b2fe2601c3b95621a452cda89cf3768 -:003620692b4fd64a1d9f13ce5be9adc8e612a0 -:00363055f051dfd53a9478ecc5f05401018b5c -:0036400e0bf7d9f92f316bdac573575cab2f30 -:003650e07eb3de296b25d853fd842fc5519448 -:003660026d21d4f40184f864dbac6a1c77ba20 -:003670004239ed99ba9d0940547e8f6903e196 -:003680c779bcffc2ac0be5b293f45506c02b38 -:003690b16dce75fb47d4bc39013dabcb813df8 -:0036a02e92aece2d26100a14b8f9b1ed6631ff -:0036b0567009b20bdbed8ab1dfa6e8baa436b9 -:0036c0456f5e465c121ef99539ca94362d0fbb -:0036d0dd03291ec18f44ed569fde0e08d4db80 -:0036e05299cbb9610e050ba05b911e4d06b054 -:0036f093442a0ac5c139461325d7af011431e3 -:0037007b1f51d4dbed8d7306f9de816c273499 -:0037105f6e36b1762d9d7cdc556ac9f166cecc -:003720b5b02dace3d4c91b5b17afd795adc1f8 -:00373024c267b76f9c77549f18e18a8be33351 -:003740d3529a591ea8a0a0f4c1fbe52ce2f554 -:003750cf96d4d2f9eb15a699c894ee1b4e3466 -:003760956f14291addddf80ca187b43dcb2206 -:0037708fb0f942aeadc491b9314d3481f51981 -:003780872430908d6f39dc1fc0322ba5ee51f7 -:003790ee7ab17c8e66beae31fce2ea1254da4d -:0037a00fdc02f4e1fc2bb26a1341a0e775e827 -:0037b0d93bbc2f11f2011a3973c3509a6b41f3 -:0037c0d2310522f383099bc0e8c5379cc940f3 -:0037d055e535d75edb47f490f5becdcf6c1bee -:0037e0ecd766c9f086281d7c78d05e2222ffa6 -:0037f0543e926e7db27c62d19fb1edc8d45c35 -:003800b0442533c95333eeb030218c36a0c050 -:003810d7e742ed7190af44b3de8fc264cd82ed -:003820b3335297396b41aa0ec222b420999769 -:0038303d457d6cb18171d7dbf2dcb152b2d9d6 -:0038400d113e6b353fc5907fb3d6f7be11169a -:0038508c8beda3f4626f7272fd557e219e54eb -:003860ff5b1b2e895bb1b579e4c14071c11b95 -:003870784b1f40e25317b77bceedca2073a0f4 -:003880d2d22486f5c795975d8cd2e03bd47e06 -:0038908f443ed60f26df68964d92d1654ab2aa -:0038a02c5f534ddf0dd69266313c2553569e62 -:0038b0a403ce9b26678597502a312443a4248b -:0038c06bfed38188e57ba0932640bf742b58d2 -:0038d0ae8f8f9dd427253879e75f5400ba0d40 -:0038e0ee4df4c42c9c98ef1bf2f47cf85f4193 -:0038f0e3a879452db6e27b7c1667a74b14b0ee -:003900a0f02c3551c55c74105fe01f599b3a95 -:003910534a7936357165ee049f8ab64caf903b -:0039202d17eb878a7963263aa4c99c03f10530 -:003930a913c209131affe3269fc65a25293047 -:003940feffe2eaeca6dfead87f01d5b72735b6 -:0039500a02a45d3137724b1e2d47e33682ffa0 -:003960ac9508500c6d38a74287bfa4ee25ea23 -:0039706eceea635e19b9a531c34bff331a7f9f -:00398050820537d524a0800ee82fcdf52dcee6 -:003990d9d05de1557269b93a4c4e1149fa7584 -:0039a0f24c16d345cc74a829468f248b8b0c8b -:0039b09a49144cd64a4a45d5a5ca0907493162 -:0039c05a6a2d6dfbaa10a318cf193a3f7d4cf6 -:0039d0202d1a515d0b4a3337102e117adc110f -:0039e0d5dd0fd1bdb665597076f60c06c31569 -:0039f0cda3be549f6e9ccdcbd2bd15b43ab089 -:003a00d083c004e44c4e3f19302684d809841f -:003a10159bd877485a4e2845405395881ab922 -:003a2056de3619279d51d043879d3d9ce65940 -:003a304b5c283bdb309675a31983818459a76a -:003a4079471ed380d23bd4f88b31755e18e706 -:003a5022905a982609ef7999dd79330a970d77 -:003a60c20e2cd482223d00736f19a9d060a408 -:003a70ac0a4aa5a9f2cab44bafc378593b97d5 -:003a80d76369ffa764cf123daee47065478da9 -:003a903ef8e34c3bdb577b444dcf0d6d3485bf -:003aa058e2232cf3774d4e5497485332917f03 -:003ab0c651030bc08c3b3d2f2d69fb851f8e5e -:003ac06fcc9ae71e5fbc5dbc157e7a59e69dfe -:003ad09944508de5e62bd51eaf17003ffd0107 -:003ae0ef5f7843362acb888499a1c89e45309a -:003af098ea75d2de49f1ce2ea158366723de66 -:003b00ee3beafdd00de81c1b9d3f6488ff17db -:003b109e294fd10fcd87aef9a92210c46e7fb6 -:003b202050239141c53b23e9b3b9aecd50d113 -:003b308f857ad303207fd0c9e7467866ad7798 -:003b408db62fd99548712a8d6dbb8eafc33b31 -:003b50cfcac17d5d5b442433fc5b71bfc748bf -:003b60d44980a81f0fd09b146cfd792dbca1d4 -:003b706fdf68629add1de5d0f36895f5cb99d2 -:003b806d64db05188f508b8ff7f1c03a4c6f3a -:003b90c5c3272c1e804145bfb7e4d2d3607d75 -:003ba0f39c1781792edea3daab34a9f78c0e76 -:003bb05cb34ba30a512b9447c7d4b639b83555 -:003bc0fb12331d479b10d5383691b164110824 -:003bd079ff9601cecd5306c2d37504e706f639 -:003be073ecaefb595ab77eb3e8f3f5c3d343bc -:003bf09d0e1b123f39c9296f054c0f0bd37e82 -:003c00b22e9f0b65a500f85ab7725b03bf326e -:003c1067405656e536a04e0921ba1b8400a227 -:003c20ea68ca95b2302563c8c767c30e3a2bfa -:003c3007548cd9431632f9f19a6cf5277121e5 -:003c40d8ba35097e9e296432260c4d548766d4 -:003c5025989ecd4594dafcacdcc9f984ffe4ef -:003c600df9597caa7053ba35bff29fc75dc273 -:003c700c3e58d7440d9fa31bd68bd6f08f596b -:003c803d1eacb87c13eb780b0dcbeff895ae02 -:003c90d1b37acba93a91971170b09f64ceede5 -:003ca0f2cf903982c34a0dac1ca1c751aef140 -:003cb040e5b82b9acc5a85de593b89611392ab -:003cc05dc6a73a1680ea273f4cc2c59e6574ab -:003cd0416120ddf3259cfceeaaed14217c1564 -:003ce05d7def6ee3ae26cd0f2bf4b978bcee8a -:003cf06359996e116e403d7cbb4b9f952396f9 -:003d00dc985cd52f84a862e17f8aff8829e30a -:003d1031a139a5cb52faca87bbea1b67837f35 -:003d201044a44e4eb261aa969430087144d82b -:003d30786497b1347bea7dc2f912d5b5a9f063 -:003d4005141553f64318772a2967f6b46ee342 -:003d50de052ebe450dc7bae02747e733eeef70 -:003d6041900f250a9fac0549f8d68158da19d0 -:003d705ac23db716b02e29e6264facb3b934c4 -:003d80a23fbfd1fb460210c63e1a9defd6b1ab -:003d909fc29c620feea1226c6cc1d51efd810e -:003da09421669528c9c731904c60d2303e0514 -:003db00b8fa0f5c96610615fcc98a43b4393c0 -:003dc01b81197fd121bf3bebfbc440deaa9c47 -:003dd0622dd22f07b14e9a331b72c3e6ebf0dd -:003de01175cfe2493c67d3238fad043bb1d0ef -:003df07b6c588ab462e9bb323687bfc1936f8d -:003e002b9ba1e7af0db66c5d644c0edfad9b0a -:003e104e4515e8b397693a39d71af9da4442f1 -:003e20f813b1163101c8b4965c1e60681f64b2 -:003e30569d5a8d8d146e72f78d1214013310f5 -:003e409a914ad91daab10167399dbe8d24ab51 -:003e501179f135692c659c501a8d0fdb575453 -:003e60b67a4f627cdbfe3922f02c16186cd9f4 -:003e707964320e2950bd41fa35d9ea652151e9 -:003e80fb35382f019f2ca7663831537be94150 -:003e908362136974b847f8ddbe774944e27d1e -:003ea0622be88660598b2742a84f4fe66b4921 -:003eb0043e0f49ce1a0a959f755ee5c6cf7af1 -:003ec0bcfee6e503bdf68f4887b9b7db4c9df4 -:003ed021ba10ffd9c13346a4ec95205d8beae2 -:003ee0ab05ae08911bf661b6ee04aa021999aa -:003ef011ad0aff28fb09b3a25c3e6f55ebc584 -:003f0089c4367e555c43da4ec721e0613270c0 -:003f105a17785cd69232ad68fa998862fc63df -:003f2062780fd097e195db35e55ea7dcf1fb08 -:003f30545599ef35fc8d162db292114e76e123 -:003f40a352523b0717def7651486a0acca0d01 -:003f50f99ce22dbb606d68d1f379720fd5bf88 -:003f60e95a2d3b53e64f43a2b59564b5372413 -:003f709241253281793d57796c0efd863797d1 -:003f80410872a41159af69535fcb9c37c66b96 -:003f90190f14879b2a95a80aeebab85005d6ec -:003fa03838b601daede3e845e20568a7d80a79 -:003fb0aecc1756c44c3f503652cbc517c3fca7 -:003fc0f81040e9a8de1e387ea9ea461c5ca48b -:003fd08a9e5fe5a74f38392a71944a7807b8f4 -:003fe05f81c6b69e27ccbe0a60475d0f449728 -:003ff0a36c63749afdc620af7f031877a2ae67 -:004000488da6abd5ec4dc9104593bc2a32f55f -:004010d3a32059c36c4c3a3d49db81f4902b83 -:00402008c0e0e0e663af49175e04b46111dac1 -:00403012e3c0571636041afadf88cbe93119c6 -:0040408c33ac58162bcae42cd75f7c1f208eb2 -:00405031c203794e5aa9ec2b97f24e252ad17d -:0040601428c9185830ca1ddbee947699d39cee -:0040708b90b5e357ff6fb7bc785594a287d091 -:004080e1662a3a5c2c27dac64d5634cf65f906 -:004090ac401824df5ce051382bfc4d0df90c8e -:0040a01df0644af3f0ab104c4d1061578e1983 -:0040b0a36efe16915da6040454056cacaa87af -:0040c0538d78d557e3da60fe63720dc31ec80c -:0040d0a64c924ac22e13475092388bdd157131 -:0040e05f5a0e9dd20ccb1762a060bf5af4d8a2 -:0040f099763d81448602059fbf015a59d19b60 -:0041003bbb141e7c4841297cd1500b25f1d15b -:00411078d6461ae15b2615b8b5221f24cc34e3 -:004120b1c2c52bf3887c849bf3e2916dd543c6 -:004130eca12971089c30783bea32960e1606f1 -:0041409ec7f8f61502f2b2b8d14ba06448a944 -:0041508e4108bf815e9ac52d1710d78c403d75 -:00416057d310609aa416f6bf22b9f8dd9b83bf -:004170883d2272c7aa65ea1af69c5fde370841 -:00418056f27e0f17324c1583f2eaad6934f8aa -:004190bed51a290f12d23a07b22a315a636b1a -:0041a0f2e4cc64f9a2cd3077843f12c4d603f8 -:0041b062b4f4cdfbd691b444d96c3dd5a89c0f -:0041c077d6c2c27373f83ee564ec3868aaa574 -:0041d01e80ee04b985d2da636c924f0df6329a -:0041e072d0788434a97fa304d9bcfb2fbc17f8 -:0041f02855a94ba417ce85c4c49a15db071995 -:004200b04f555f11ab56063ccd625bd399bc9c -:00421049732745455b27b9c5ae42901a60caa8 -:004220f71ef963b16d38c177fcaa3b979dbd99 -:00423019f00d4cb987b15f8b6ec7b956272bf9 -:004240c8bcab60c426f7a9a12bfffd82581d49 -:00425078824daacddcda5281758325a3692c83 -:0042608e08e89e65733575ea1dd362391dce21 -:004270cfbb05cbc5141ad8c1ab6750d61988ee -:004280b8a657512d8a852cd5a853fbef5a7b5c -:004290b991997b976e661acfab6530a0019441 -:0042a0e4c3b3dba335df4ce0b2a0bf7522ee3c -:0042b007aa062dfd461fbfe61ac637cc75cedd -:0042c081100a52022dede0576ac26352f8ebe5 -:0042d0d7073ad3fd6e5a210ce3cc44662f6978 -:0042e008932a8cf2aa8b013bce01ce810dc171 -:0042f035860731dcd93ab45fbd33dde3837fc3 -:00430069622e29ec40202259c135b1188e3ad9 -:0043102717aed22a6235ffa4819310b131ba3c -:00432031b156cd6593e40449426bb5724add30 -:004330f4523a104ebbc534c81718d5468dee24 -:00434081fcad69d4786e899980b7dd565e4110 -:00435084c76ac950d21589287170759708642c -:0043604db518253858c92b527ab6537993653d -:004370c095161ba827becf7dc3d32fd8909242 -:004380dc96fa8884e32a4cfc09390965b04aaa -:0043900af084bd902e123d9e2f59c1735b79ef -:0043a09d097bb0a9acc632bff9ea07b85dc6a9 -:0043b02c0ec3143e967a220f93144db3906538 -:0043c008523c5b5b82a822b635c61f9beebc6c -:0043d05faa5f72a1793a1f215378a50efd1387 -:0043e0f41889b43893634d396c3e1aa1feb9c2 -:0043f0a15a0391c4282f390f369476be52620b -:00440086eb5c2c532ccb6ca26236ee387bacdc -:00441058e30db50c89ba4d8fbe9aa9bd579f52 -:004420e8054ce8cd0ca30fc1dbee44c3eb3b6a -:004430c1bb3f7ca5ed6bf55bd8ba654ad385f0 -:00444074be1e0c8c1d75d8ba76ff9a9076f890 -:004450284330a3187f4017cfebb38d3a7b5276 -:004460870e20511bf925891d5d12aa8f03fca5 -:00447019acc15374fb4a5ba27e31db0cadb49e -:004480498a394ce5f5baab753ddc9c1292f553 -:004490d4a2dec1ede2dcf11172a2e0455e61f5 -:0044a0c3c3181207ce2a7a5a99b62eefe37175 -:0044b0253c7dc1a6bac6d74e253d727edab5e2 -:0044c03193a9030a5329823e4a37b7310750e4 -:0044d0bddd44502616e41b06c92c27d6fd5f1d -:0044e0ba820441cc2ceba5317b71f9eaa7a252 -:0044f069b82f872ee1b555e3aed233560d59a9 -:0045006dcb0ca1c79b22a6923b64c1941b68af -:004510159ca41586f35c6597f09c08c246a192 -:004520511ac359f2d1d620d9bf71d1b6962fdf -:004530a07e6de2b03bd138e71adb289c170cdd -:004540da021c66e7569ab3a932a3f7d397d417 -:00455089ec87ca896afff38de2e725987db614 -:004560db3b6c6809b28975ca6a8d71c4e7f772 -:004570388ab524080c95729551b5b42fdb1399 -:004580bcff74238ac7f55b84c4c33529b269bd -:00459080e8606e7617abb706f57939ac10e0b3 -:0045a097e01e2bd580256ece7371ff9676ccf7 -:0045b0961c0ec1f68b4e7c3330441c9d66ff6f -:0045c0b9518d3a80ec7825b81e4e0e287aacbc -:0045d034e5eafe5e3609b712bdb0763b14195e -:0045e0545df610117ecc8b84a5dcfd3c916bf9 -:0045f05613741c9442c48e74931673ce5deb3a -:0046000a3245156b6fb70e2f944cbbfd0a5a8d -:004610df8bae69092b61d4d2cbe2fc42e4de26 -:00462034c66bac97160dd504ac007bfa315e47 -:0046305bbf56f8a589014d5ca7d83166805682 -:0046401a3d7310b43a5f10475b0621ae049c46 -:004650ef162d10e910baece019ba119c409871 -:004660a4718b99150734ce69921fe5cc3d061a -:0046707a6094799d6f4929f356fb372aac2b3c -:0046804a3eeb2501da8f732f865145cf7bed23 -:004690bb832b6b68b36a166fe5353d6b3bb28b -:0046a07d51056cc947b41e8f8747cf8b59b4da -:0046b0a751bf122b9dd33f0f8f16e1e53beeb5 -:0046c05d64c339365b99d5e48602ed1308ecf6 -:0046d0a7ceeaccf5a19444f608fa6b15a01e30 -:0046e01ef4983b30593dd4033a204e5db95e7b -:0046f0d5d93acdbc21b2eb30b6faa3ba39c1da -:00470058886b635c360308c4ee6b6cf88aaa3a -:004710bae54160b4a43c15b63c0a4052da341b -:004720254541ca125fdd5c783d0d29bfd208e8 -:004730830a06bef0e65befc4de18493ddcbfb0 -:0047407100b161a6c2678d0bee77b05b8d9f74 -:004750793e048274946cc97e5f0465e2e1a627 -:00476054633ca20c0d548c6e3d0d0d8b5f34ad -:0047709cb62f1991615e24327f207afc4774ff -:004780e2807bf37b13d645bff8935a546774f6 -:004790e7a4801a18c7695a7dbd52585246122b -:0047a0220e6793e98fb9c969de8f66fe683712 -:0047b03d2df21682ca324ec339c1f872341c96 -:0047c0d25c099917dfa91ee0b4c3aa54f7fd17 -:0047d0a7fc9066f3d32beb0c0cfecf52f0574c -:0047e0f2870b087009cf91c1e01ac744668e0d -:0047f08896b3256aa61390289f1edf2e6eba78 -:00480008bd6df3f971fc7767937236fd2222fb -:00481064f294609d07be99d43007819fb621f1 -:004820683a09a6a12234c3a7a2fc2f688047d1 -:0048309e406d6a6752f575592418971feb56a8 -:004840c3a11d22e88217b4200b5e436c068966 -:004850e5d9cfbd64d062f80f0cde05d6a54c71 -:0048600bb1761c3dfc3c1d6359f4f595a9f177 -:0048708034197f1c914cbeaaf7846b8f0d7183 -:004880488d9495e1e41a82bd4fc01a472fae04 -:0048902aeb5085a53c194ac8663fe3f44907a0 -:0048a066c9c982a7944689b3fbb1ab99af20ab -:0048b083c52dabf3036752aa2c7a29ee0b8230 -:0048c0624af62b5743b966faedb3498c47bb71 -:0048d0ef24f04668a09fb501710450d68ff01b -:0048e029c2fde41a610614c1fc3e0577aa8084 -:0048f0e53bef29519e39c64204edb3c1841723 -:00490014d6555572b3fa429ec8f823fc1c72cc -:004910b4ad880736b5cd005dba6937f39d8224 -:004920b0dce38c84369dbf3a7acccca714ecf6 -:00493089428ad09d3523be5d9eb4ed2385eda8 -:00494059566a5078803f8c479d222dcaf1e27e -:004950077b07fe30ac665242b627fa7fbdbf49 -:004960fa2a7ab043603fa5eeb9002c2a611f07 -:0049705cd3ab2076b38355b28f6adf7e0fa936 -:0049809edb87e949b3773edd2b9ce8b95d10e0 -:004990bf0f77ebb6fb0dec76eb2da3b69ec348 -:0049a0a15dcc657a844a0ddc6b72e2df942d4a -:0049b0de71675e2dbdf37168ec823fd59ca4a0 -:0049c07631f5d35796b6967718ade0f0bc31ba -:0049d04e43b9236866a5b7ab34532192ad721c -:0049e0512e79dc508e1f72f775997c48deed4f -:0049f09e6fd014dd6281828ac6d22f092e3d2b -:004a00320edd91fefb3781701997080bc60e27 -:004a10a0b91593b03a15a076d1abd5fdf25084 -:004a207cb382ba59fc8cc5e20f8048c95575af -:004a306589b25952110ed9b88277d3950b3532 -:004a407df922deb0b2005ff577a00df4f07f9b -:004a5068d73caf8724e2ecd22b1bac98a07e15 -:004a60442ab450e1812905963c0ee0b0bab2a2 -:004a70e1af9b22ee2b854db381c570d6a8025c -:004a80e90d05034e8d7f092a64227d327d9f41 -:004a90337fad0464582ffe8c9ae2f26a9f2f1e -:004aa0bb3b40de80f7cb297f9cf948966bca6c -:004ab0f66cdeb53a9dad13a7aec6d402e2f9dd -:004ac038bdf1d7c780ec388929a9cc04867191 -:004ad0889b1a9c43674ba4d80cc3e956ab102c -:004ae0eb610c15d061c1cab74e74079d291f18 -:004af09b9a68f870ffcaee1fb440c2d8be31f3 -:004b005126fcf0051fffe2e49abeb3f5d0f7da -:004b1012ab75613511fa0b10a8e107f3a79af5 -:004b2008b184c5ff70784958b71b788bb7819d -:004b30b056a89f812090f7bb0fd306080769c3 -:004b4097dd645e1b9daf9ca0e4229a153b6292 -:004b50c2ce3d7c18b33f8db928f4cd3a1a8aa6 -:004b60895a23daff763b41f9eb3ab5809aa7d9 -:004b706e99990f48b6df04f09ff65854981e31 -:004b801725ff541d71e4e1c1d6302229a465cb -:004b901c80a1e6157a484d254f7da753cfa978 -:004ba0edeacd2bbd54f94f6a600190270ccd30 -:004bb0147707380af516471f5a284de116f897 -:004bc05c719476fa567e6251da897839cda4ec -:004bd0ffcd750bfad67d79c9f8abfdabc4aefc -:004be0ca9b688620595222969c278d7f26b669 -:004bf0af24373b00fdfc28f368447ccb1e7ed4 -:004c00765ce8d07554620709ab6326f7c16be2 -:004c1085b0f8f687cce8e3709794888faa37b0 -:004c20c74c232bdeb74cb364d17a5f51440775 -:004c306835e0c1a282c062ebd6b13ccc42d4f0 -:004c40f8da21da442f6d7127128b3fcdb825e2 -:004c50734d1197120733cfd41b35b88ceb9346 -:004c6053677a9d543ba4f970e26334a221e625 -:004c709f7c49e304d17081d0c5d3b27f5b9c3e -:004c80b31651b407152cf1ba50a6e9c27a7002 -:004c90d18771523b315694b9470c87351517c6 -:004ca036b44d71dffc90ccac427e8045058838 -:004cb041c2d55862ec7ff651fad4fb7595b8b9 -:004cc0e3a1d6b9f25ec37ad2d9bc6bcb6ad27e -:004cd05cdc7f5aa945c76688feff0776a6bba7 -:004ce093cc17e775433e154318bdd09f1be1e3 -:004cf0690e1c5c0c09563ae15ba3f90e5dd79c -:004d00cb1f80dc5752bffabc21fea89ae7955d -:004d1009b92bc305b68307947bd01ec9556ff0 -:004d200fe8b745c445528300bc52ff87798952 -:004d30eb13062df205b5e1aac14c7a10737142 -:004d4004a00a76d33b847167569368a719e936 -:004d503c33d1e28b0cb3076fe50618c81c7739 -:004d607333983d87ea77e09832cad3cbcffc06 -:004d703e41d7a28a1347b5aab5141739cd53c6 -:004d801d5a0cf2295886d254b889f095784814 -:004d90410746075b258ab708d5343e5ae5cfc8 -:004da0cefd879819ddd8d42de26ea90ef402ed -:004db0c8eb9e0b5957dcba933743daffc4ea9f -:004dc0134ad72ab5af81239d8feddb3a3e3ea2 -:004dd03f7ed355aba97cd91d724c93faf3af58 -:004de0f105b1d5e8c8a6979e6b2d0a808ba12a -:004df0e1afd08321ef37ecdc87ee585a80ac55 -:004e0073299a8b41086862d93262dedd07a2ab -:004e1067deb5bd39737a2ccd5da198453763c5 -:004e20f1e9d7df1ee3e63cc954dc01561631d4 -:004e30294136747e09723ee12ce0e9a9d6b41a -:004e40c710e21353cfd72623a190edea7ed5be -:004e50f57403d6a49f2cd621e638cb05644de4 -:004e600599c9d8404f42a24728bc8f30841194 -:004e70add3bc7e3cb5fddcbc5a92c801e3b24c -:004e802d3ca3ee951c0f16b52d698f36b7dda3 -:004e9083767e6353e5491f657b897cbe086a37 -:004ea07a8cce0c7f3b59450801b98dbd29cf7c -:004eb093e9a424838a35e01a6e2b8611073621 -:004ec0782af2d9b3c0bff9d07ad4c23a628904 -:004ed0d1f9c0c07c220e85351a55b2f2bf0d82 -:004ee01b032b9a7db58c8e67749490a7053d0b -:004ef07fb07a30167311ef8de12d2c1638628e -:004f0098581908b3f4d96a75ce05fa387c52fe -:004f106efa2d96c1758b9cece81f236cc3d180 -:004f20d418eb430a2e674ed2b6f570bbe6ddb2 -:004f3061f0670e925d6b082e58239dcbd7ac1d -:004f403a6408049da6bb6124540a5d5db8592f -:004f50ff1bd55a136d0742827e14c91543b56a -:004f6019ebabe55b4263eea42265ebaa9b4dbc -:004f708df6b16ccbbdb55659ab71a3e41fe559 -:004f800b9610362cbc18fd92758e1eeb4eea48 -:004f90de055680b443c7a6db587dd9f6eb6921 -:004fa0e7d827bc62b3937706cd8247d09d9323 -:004fb0390194f23a0b0457b2b8d504d90559da -:004fc01820c46f06bb03506e6cb6c138568813 -:004fd026968a66b7e9865e50eff8ec11d7493e -:004fe098015e4a0602e5d5c4a69bcc62d4a6be -:004ff0c24ac8f4e4efc613c0164de1d2f165b6 -:005000ed750b7d7ca101daecebee40d3b073c1 -:00501033161dd01c8f26361e2dda9309f0bba3 -:005020c3e097d9413f83cafc790a7a9e503617 -:00503001d1a268131a964b6400c4ad603a91bc -:005040983743e1fa8f2f25c8ea65a8b4475cfc -:00505030006efe7203a0710e86f269bd892c2d -:00506082dc8c9ced8c0983586e71e43daeeff8 -:00507083ec942f1de08f914940eafccd27e9e1 -:0050809094af31c478fbbe330e486399e6bf1e -:005090fd9e8d44dbc194897f2aa4207e0694af -:0050a0729077684b8ad96a489fe238e08a6f0e -:0050b077d78cea33787244e14f67bd22b54956 -:0050c09613e441b342857906547d49f62655b4 -:0050d0f76f5e4490739b2c37f8a5e8abf0bc3d -:0050e03c313c09f5d69742f5ed7b048d11eca7 -:0050f0702a43c55753a366464171b4bdf482fc -:0051006b94b9ab27c5f30d1022d2c0242c29d8 -:00511077d8655dfe956313c320c120b5f25969 -:005120b0545a1532eec396ff48d1a660545efa -:00513029e287b58e0428c7a837a12a09ec5fb8 -:0051408c02cb5513ae203662fdb51e428fcca8 -:0051505d3e151851e73c9eebe9102ba4526485 -:0051606920529171e012688085718865f1b92a -:005170a3ae9e450339c0ee843890466f9d71f0 -:005180fb26c7d4fc80fd460b3da8ea3a9dde89 -:005190e9352e93d3d407ee6537fc1b088f7f16 -:0051a0a74810b773f95bab862749943072a7a9 -:0051b0ae8f16403005d532f11d0c1ba8cdd9c2 -:0051c08fc2b9278183ed1ee9558c2a41559607 -:0051d07aa2a73830871b1e9709dbd80e67cc21 -:0051e013e82b4b71f3f9873526493b0e36239c -:0051f0bc3aa9985aa0920b2cf3a538142d7e77 -:005200616f99143808226aa5de2b244ada0397 -:00521007c31a6852494996d67ce7cd2f893f10 -:0052201fa428e030feb9ca9a57e533d47e8a55 -:005230722eb501ba7ec77193047029f409bdce -:005240d9af7956ad19df3c5464041e29a9568c -:0052508ba95926fe95e0fa631b2f0d7d700d5b -:005260b2a6bd7646b5e3de7c9467cfc99f1aa0 -:0052702890e8267cef189604c80dc9cfe38184 -:0052803f54875ec8390e422d3dbf42af928ee4 -:00529055fa6a862000e0d634712133eb35ff08 -:0052a0a35e120ea0f60b32618f7df33353e781 -:0052b08e4ca91baaf087e3ecf38ca69c90a64c -:0052c025a7b6471ad4b027933d8d85e388ee84 -:0052d0ac5a8625424b88790aa19516c8b96655 -:0052e0e3cc9a7789ed3fed513dd1251862c245 -:0052f0e009fcf5af6a5dc728d504e55323d0d6 -:005300e73db458ec15cefb714e69122e283a38 -:005310ee92bdb4771fe9482e6cd66f12d8c2db -:005320e82dc81e3c4bffb8cf27b44c404cdf3f -:00533000681fe1b67ea4fbe3badab1b1f3fcef -:005340a5a01a5b5c34c2bbf06ba9783b639ffb -:0053502b233bc9e181959752088b8648741bf6 -:005360ca3f44127c1a342a967b7de08d53c2b2 -:0053707e0fe0555578f6d025f62ec8293a45f4 -:005380f126bd5d5f598b933a1901c291e375af -:005390b4142c0d82f02fcf87a84222e4495f07 -:0053a0581de2764e70a464c5c088143d64baea -:0053b08858d7b0b12c54dedaebaa8c2d96230d -:0053c07fed02bd5a47b4180827f42f10b01f76 -:0053d06cc32ca14eb8e746248a06d59383d837 -:0053e0a7648064fa19ec92f7c79af672c6ebd0 -:0053f0178ced2cfa87c1611063a52c19664731 -:00540024420565334c50c2e9010593d8532b6f -:005410ce18182d7e95d964f63c18a3a5541857 -:005420c5ad83a3d298c57e663633160d17c24f -:00543075319f9c5ae386fe824591e30c3ddec8 -:0054404904722d86167b12b8e3ff2a39722143 -:005450ba7f85b392670a33634e68f7c81b84a9 -:0054609bcf43b56b16c863a230b77a3b15132d -:00547020704449bdc54307f860b1d4ac01de47 -:005480d4043a58202fb7a8a8d80393f5d69315 -:0054901e3db8d2dcaefc5d3cb8fc877a871bb2 -:0054a001a78665ddccb0d4f5db25567ab90972 -:0054b0d9b617f170ca8bf5ca4f020d7e380792 -:0054c043ef99e047909b330e4c568900515cb1 -:0054d03118d8d0f69de068d208e3a984148e89 -:0054e0c36f4f9d4a403c7d3b1dcc4a5acc008e -:0054f0ddd3b8615a5328f7930c00e910e76b4d -:005500ea466cac159bb4343cd43ad322a38cdd -:00551039b0dfaf3fbeaa55e6f60e18efd00215 -:0055206e02be6c5b4c5f24c130893390f4c5c1 -:0055305d67d600bc21720cdfb677cc5de4f38e -:005540bf5915be7fd9edad19cd3aa79cd6a626 -:005550df75836753e44cae2d7c2dad3e743963 -:0055609974e54662cdb9d6f51330252c7c5104 -:0055704c7f420a647077bf32126d0658aeae82 -:0055804aef25d15de087224f489420adfdc5f4 -:0055908bd61d9b1031f6b688b9bbea37914b70 -:0055a08e221ce07151acbb3cc1df6d8497716b -:0055b00861ca55371e3af1ac33f4954a1d65b2 -:0055c04e8a50b78b11632d98c320d9a20178ca -:0055d0f7bd6370e53611f84df2b697b6bcdaa9 -:0055e08b65631ab3e48ddde6f3c14c72750774 -:0055f0053f35792615027536ca4471e54ab9eb -:005600063a32bd60934a76455abb30e63fcc05 -:0056104c25b6c4fa136033c474f57a79630915 -:005620f6e9cd6eecdd4f925a854d5c909713aa -:005630196ad1f767a77fdd185ded19b88ed2d9 -:00564091991d2599a8a278909140405141f87c -:005650d403bd51121f4fde8c6ae067c66cac66 -:005660430d5f893872afa314cb98ba29c28625 -:00567054bf1e4309d07835ff07a40dcdd3505a -:00568089480477249c526dad88ea270dfbf8b0 -:005690e264de57a6cc76e0709a9b9d34df8ef7 -:0056a0535059bc4f8f0d416ba908012a2fffa2 -:0056b093fa0308e0945620a85ccbcb9e662bfa -:0056c0daf3765a81cbabd3ac1fdc408fcf0661 -:0056d0afd5cd0930e941d020365714b29663c6 -:0056e0448d1d8d4f4ffdeae32fd0cfd967c63b -:0056f03d002505ea5314107b679a3be4a928ee -:005700fca142abe638aee30c221fdcb707e584 -:005710ec3630b8b100420cbe375456b66c3534 -:00572048a7d18b77d26d8f2b4199cd41a86fc7 -:005730a7e31aa7bac9d3b26534b29c8ecbbeca -:005740eaf6a094e2bd138d6c3b21847aaea63f -:0057502b2935ce8c9b11d43533c1e98643077a -:0057608865eaec13230cc636f8fe8a8266a9f5 -:005770757db7b070b265d336bd8403c1091efc -:00578018573de5c9a078b5e6c7f37620027e33 -:005790403b48ac9d6398d093274db7d2775039 -:0057a0c040389cde00f1f9bbf1088c96436c31 -:0057b004e83d8f09475a96d763967ec9596af2 -:0057c03c8ae93865b9e4f5552120d62a57b5d1 -:0057d045060a594cdba69b96a9da14e643a0b8 -:0057e0aa5d4148a316d747ee5d09b5654f5141 -:0057f037c5d59c3986c156be9d1490967d1d70 -:005800d6a794f597fd2cd868ca5f922c079474 -:0058100abc2516a27014419f75551c8a74c485 -:005820f909f49645679d85db16ed838d8214d8 -:0058301b6d08a978efdacaaa5181dd25f2a05e -:00584066a75b98df6258d1d7c78e07b96f540a -:00585034feb69ccc16d8146f16a3af98ebf843 -:005860ad66f57f06cedad41b6373ca0b8d20cb -:00587074ff269052ab16b1a6cd4d0b6958462c -:00588072a73e522b7ff564ae60ed561c944fff -:0058904ed57db46e7f06111626207b97e8d03b -:0058a011f1503b27d1bb20ed5a668d4b9eea7a -:0058b007734d924e623f1b9a6020747dbc1878 -:0058c073b738614bec476eba841d201014dce3 -:0058d004cbd45f634b31fda675cb998ddb8c93 -:0058e028bc06fccc06c49e917b0b2926673444 -:0058f0117f722d2136954f8bc4f170e7068178 -:005900111d85f51c30a5cc926fffd8e016e55c -:005910c3cfba7e3fcb20564a156e5bb183eef1 -:005920721088e84bbbb15af96965e19815e296 -:005930d949b336467149e2a037c7c67fb7d9ef -:0059403b08b7b4b1d542f54de40e70d2ddd382 -:005950a9f2a010812be0df41cbb514fe9d6fdc -:005960306d6e6756fda6e739f52c217af904fc -:005970727d7bad883207ebaef9a471e1a3ceb4 -:005980b6ebddbed1b076e7fc10c1ab21e5646b -:00599026f2871e0c2b8c1146a2091cf4da8851 -:0059a0d4a2cfd38dceefefbfcf8a2ea97130ff -:0059b0056aa85d2406b01d7ed41fd4a5f71fe0 -:0059c0868c6ed1c66fb21d235f62812021ccb6 -:0059d06445d125f2f3150563cb392cd13e56dc -:0059e09a1af16d72817a80f1c25db9e10013a7 -:0059f04b59506ff602c41dfcbb52bf95aa85c3 -:005a00bfba5e755d12da611d9ab3d1453e865a -:005a107b2350b1c44ece79c0d2e8587bdba2e4 -:005a2040cffd30977b5119fea74bec1e3f562d -:005a301366729ee0252e0983c37cc3a2f10ec7 -:005a409fd9cb5b94e16af061db3988676023a0 -:005a50a8085357e74737df83d8ee3898be6da6 -:005a605e7e8318df779e27b6510f24ecea9cf5 -:005a707e9ad03c202172866a29db61eae49616 -:005a803117ccc2ef0f8df166c69762ecb82832 -:005a90f4873debe4b6394b7027d6ebf52ddfba -:005aa049359426eefd042c3cea92c93565c114 -:005ab03b6a437a62680c0f40fc4bb16d303375 -:005ac02a42066e3266f7017eb24ccbfa55f2a5 -:005ad072be2dc0c50bf592ed2eb7e84294511f -:005ae07b86942835eada1dce0daf4b35faf520 -:005af003303d7a9ccd10883a86a6793f58bff8 -:005b00ee405b40de250fc06effce127fbe6ee1 -:005b10624862376beee1137bc1aa2df1185699 -:005b20a891fc90078dec893c8da420954e4356 -:005b3090a4c20dfe2b44d55983b6c202375afc -:005b40b2ea82631fd426f821050d337b52ad1b -:005b5082cc8c7684143eca38baded0ec606e59 -:005b60a5fa41887ad097b55ddbd148e1d6237f -:005b703abe21b39d76de6d846a9ab10103eb7a -:005b8053a906a57bb0694863d96511101c5f5c -:005b90e3f68ebb01fdc0b13321cccd7a7ccf07 -:005ba06a33b44c7c0b2ca2f037c216f6d52873 -:005bb0c5c504c7bfa3b2586960ecf735902f94 -:005bc0b2ca427328bf315cb340f5b3c2d58423 -:005bd0531a0c68a1b96596e4420dd629712f3f -:005be0971442b663211a37bb35e58d181af1e5 -:005bf0855950dc269ac348a8236066321e490a -:005c00c57f2e14d70cf4d3a73f4c733daa722f -:005c103f0f2e19fd514326d8fe3dfa531a36be -:005c20934c77df02d8dc618466fefe59ea81fb -:005c30d1f463c753afb00c6ea6295a272b5632 -:005c40f0351a5ea8fdd53fd80099ea3b91f152 -:005c5048fe228f7eb23a077300abaada56f811 -:005c60fb1178728579a82f69922688ccb3528d -:005c707edc16347dd6cb105476b9add13c660d -:005c8004780d779337134d78ea697bba2343c3 -:005c903e394e3dadf28488f8b1092be2fb3d99 -:005ca0ad173b9fc75a2cfe94709aca6d2260b4 -:005cb02793aecd902388cbd725949cec4bc4bf -:005cc091a1bf74220167d24fc409d9720dd5c4 -:005cd06ec7c0ef2494ce6c3596ce30380a6b32 -:005ce0b8f1209d56c5636f6b8513ce747fbb8f -:005cf01a6f84add48121c3b32a5b485c0e7b32 -:005d00e592339421bec1dbf300256d8c653910 -:005d109d92c70f23cd5b2182b47fc4de826ec7 -:005d20856ea8fc77ad206b3f78a0d1027735ae -:005d301a44b4c201512f84dcf3cf4654824cdc -:005d40700fdebc5506d4cbd89e4f1b9ebdb748 -:005d508e0eb95253800fabf4b986a452bdfd48 -:005d60ac5805f9b32a8ea7d5626cebfc72892a -:005d70bca4687cb73c4023ba4c375763f0f5cb -:005d804c9039f91f03e9f6fe3d87a145716fef -:005d900002356c73e576c4eea063628f60ea65 -:005da04bc4d41ffbe9b5e4470b7d47ba22ca88 -:005db0f73275255991979b21d58e1782f21c3d -:005dc06cd48585aec0b4e198f1d92d20361ee8 -:005dd0b970f923b5dac89ce7ef8bd20fce2b72 -:005de073a395a58b5dfaaa7e456f6117d2fb33 -:005df05a38be9b3769b893c4a8d4f37327f545 -:005e00c1404a67c6bd28fd77ef924db3095d5d -:005e10095362e4377f3dda817452b60ea82add -:005e20824c2218b63398db9268203ec077c9e2 -:005e307cb4dba80483b734cf5234eda3a0c09c -:005e40c837d00e5e2fcbaf4772bce2b30f656b -:005e500b4272f412e3dc86ef8b4407694111bd -:005e60524b971dbb3f63dd8c1cb54b4c30bf5d -:005e70e83ce30a85ed9e3ad269c6cdc036e830 -:005e80ab2d637c3f72e0b4e4a4d6e7731c47e3 -:005e900605cd58001bc6a992435097f6b363cf -:005ea0373264ff4208112aea3a9de9b535672f -:005eb07c0249e6fc4def30669d1bd47e8f99c9 -:005ec07ca5c5641afa31f2632f8d7456ce2990 -:005ed0ca44cde82b5efb6fee213d3e7f4922bc -:005ee0968c2fe1ec7b7f1bc0719b24455ffe89 -:005ef00210c62fc2349aba87d90bb0483184cc -:005f008f5360dc6f860559bc3ea74a9358b8c9 -:005f1061c3ea17ba21b6e378bb150feb0b06a8 -:005f206c7a70197f74874e0580bb85cef7b5e8 -:005f30ef59d36ef1d4786bbcb9d87d2effb74e -:005f4092db0d9b198e19bb00db0a51814b030c -:005f508d666bea3d4c86a527051bf67688bf10 -:005f6005ebe512e6602887dd56cae307cee2a9 -:005f708a58a49a611a12949dacf268a945cb8a -:005f80dfd1bb8c0e1c62121d5a90e8adad9b2e -:005f90fa6158ca32dbac42dc1df8e14801ba2b -:005fa0d046d4a45166180aaf5e8d1a1be8c031 -:005fb03133add2533d2109691b3c40ae5f46f8 -:005fc075868a1439cb6da29a20e29e90f88d86 -:005fd02533dc9a7ed904415d02d57b91f78061 -:005fe016da490e2eace80fcd35312b7ccecdf5 -:005ff01c74cab1df90ac46bce436987a26f6ce -:006000ab1c1e2ac2094165644e76936de1f8ae -:0060106eebc10453644e98b9d5f278fe88df9e -:006020100c6685d6d323229b1f9ea1bd445f15 -:006030f9f379bb6da4075f0151d3b619f688da -:0060407bf28eb7e5a2dac0ea29fb5d9af61a91 -:006050bf16d40fcf8ccfd4113d9bed5060bad9 -:006060516f6fb5b9b05614d529de0dae53148b -:006070124031455a02f515ec56c1db1524499a -:00608016486d3671e752bdbe1328889a8ad801 -:0060904fb5003dfd0f61048ff6265577ae700c -:0060a0549536ce9c317ef2e574ce97b234cdad -:0060b08f14aa970fbb947a2f8f082274dca0b2 -:0060c01e8b11f697234fd90aa7fc98108548df -:0060d01cb3a1d40d6e57a13846cab55dd74f32 -:0060e0ce8259efdb534ebfb38838c2517c9626 -:0060f0de9ad60fa7258e3a066262a76cb87a9e -:0061005e7f28dde57a8c6643eca6ca108ed114 -:006110b74a6d08ca21a8f52d1f8f05e5172d9d -:0061205c9d017a31b5e7895b8d1371b7d45ba7 -:00613009ddc714966943af56d821e0ace6e4ef -:0061408691e03bed64774904d6c819665ab302 -:006150544b1a5d2018cb5ecabdf8d9baa39e88 -:0061603a947896711b69c3a6d81eb9f339fc95 -:006170d21ffd623ac3a3a8d42bbbc5abfd7814 -:006180d26f661ea53e83728888d801e2f24fa7 -:006190be0b6405836a6e61c587a599ce48827b -:0061a00dbdac15d91ee8c0f3c5410859b2f5e4 -:0061b088177bdb05a9dfbcf0a28a3ec94c4056 -:0061c02e797535444a93bd12dcf721f9ec4b97 -:0061d0ac2c9835aafb0ba216a3d00baba36559 -:0061e05971626abc010e3543f1a29a43414c1e -:0061f0a02a85912966ccf4202a15244f5b429f -:0062001703f48852429898a6cf8fca57d3e9ad -:006210b0967bed275625a025005d6dcff6f1cd -:00622048b3a2099caeb365af775dc1f25d56b0 -:006230fc20efebc726426b83951a60494772ce -:0062402df5263db27742333228afe3660d8040 -:006250f2ef00daec1735bba0f393669165a46c -:0062606f8c4d09f55322db65a4b73ba37b10b0 -:006270ecb143b1a96f3e3d95b7cf343b0e953b -:006280f16dda0123ad5e11302c8c78f9e625b0 -:0062902f68fba16234d4b2954da6fe4be889a6 -:0062a075d6e7c3ba166b8d7f414ec243250130 -:0062b06b404c51008b774debba0f8966782b78 -:0062c097845f874b3c623b5482083549bb3e43 -:0062d0c2fb90e7b4bf0b9db2bb6c0ab0c4f199 -:0062e07aabe02aa2ff61b8f81000820229f1b5 -:0062f0fc646f6cffb660d95c0310a8c4e11528 -:006300d89457b9ff737a55374da031936ded20 -:006310bcd1ef5a9ca708b98382a89c867ebd56 -:006320ef3e43faaa6cce38942c10463b01b5c9 -:0063308651b8c77fc2b869b69f49e01ea11080 -:006340fcef5c3795235a2c6f4e3745c2e65bb9 -:006350618e2e9dd29a5760d23b590648b169c4 -:006360231b96d84a88c444f5828dc4ea6d4cb4 -:006370424ff40abd7da6b39e2a76c895145716 -:0063802e6aa2938c95de14f57d3691edd8e02f -:00639034cc621f593aed29eae5de75421cfa32 -:0063a079a2bae05ab2b7906bea683781fef90e -:0063b0e854d04dbe4c630e5a7096b4551de0f7 -:0063c0dbe3ba6961f10ae483523708847ed001 -:0063d0be74958036551b7783d47fbaaa121b08 -:0063e023e0cc281c91ca33cd79a60cbc76d543 -:0063f0ea5605183fa9063776c6ba520019b469 -:006400afc193aff46064a3e3b54fdf07859396 -:00641098996d81f078c78cef975c51bba4261c -:006420fe80fe77df1619896c33c46794f985b5 -:006430bda7ce706e56e15f3a11acf6add889e7 -:0064400614f72022fe91e9d82b0c178d81371a -:006450ef6fe8651f6ef798ce73d81acccdfdeb -:00646004b90b70defe92df9324122b93354bd4 -:0064709584dd8e4819e57e4a93b827fe1dac2b -:006480b62334617584913e78f56fa8bcd6e8f4 -:0064904a7833d01868c2b352d0ef5e501d9648 -:0064a0d3f88c431d7b9fe01468b32f11f00198 -:0064b06e0b5be47bc7a1f1cdfc91c67e945121 -:0064c0a28c983dc7453868e4c61b554c787bc4 -:0064d091b42af5f05d466f4254a76068263768 -:0064e019f5e81f8ee768be08584bbe7cfdc7bb -:0064f0d58be249aa408d123836b8cdb4214389 -:0065009ffc2957729ffec7f83f75822ec4c5a8 -:0065101355f9c3592f4df9f82ca43cf54ca094 -:00652097c01ed2e370dc786282b9d7781a8fec -:006530b756175b7bc2a34c71ee7e8a4568749c -:00654096e0c09c9de43a094d0868609b7f739f -:00655088f76e7409ebf1f14c7a267b5b218a75 -:0065602d8031f35a53abc833a5af1365676b2b -:006570197c09c1ab50c2040ab2b04edf2d4fd5 -:00658076bfc21a842be2070614a2f1e99df0a1 -:00659054f2c7b75cbfa5c60707ae47f47b9f17 -:0065a0233b56adc4fb086892383fb9893cf9f4 -:0065b043d2b4e134208630e9edd95cb3534ca4 -:0065c02ed549bbf9cfd10f3ad1aa646accdb8d -:0065d0cd7c8a248ce588425d4f96839a4e7470 -:0065e0501530f706a6e48faa1469ad72234e4c -:0065f0094b3e2ed91e9a0b25c32a40c80fc251 -:006600438319d44be7493bd1f63a811003151e -:006610e99caafbe2a36a7219bdcfec8eb0c716 -:006620f42cd114ff8c262d6869b1a7ee60d5a7 -:006630456c81238bbbba2ed0cacb152dca2c0c -:00664006b8f5f5ec0c7af1cc4e5fcac0430e7b -:006650ac39423ec7595215c5cd388f64b30ffe -:00666022ae7b80fda00a32912bdadbab3d5c54 -:006670eb05e9db8ed6475745a8b17e2a111409 -:0066802aed06551f6ef1494febe185846e01ea -:006690219be34635b505463a91feb2425f0e44 -:0066a08e365470e6be61cd356933a6af83865f -:0066b0626a011770d493bde51d7790739554ab -:0066c0c11652f58a11d595c8f30893afdcde8e -:0066d03ab7d302f7e78fd779563d67389ca761 -:0066e0c530f282a0f254fd6e21bce68e003944 -:0066f04a061644b2209d0015545840bd23e06c -:00670026f6b3d0a7797f296c4b4c823cc2bebb -:006710af670e6386e00a4c4e063144f75fd3f9 -:006720f7994b8241f5a4cd09365863c7cd5094 -:006730fcec74dd5ee45473d321562027b8ac91 -:0067406c04d296bbf28b8de183f510198d3099 -:006750f6a7ae671df394ba3a244f99397f3bec -:00676013c8487f33ad5393158f57b22029e570 -:006770ca32f2e73d66a12a74ab0585415e2023 -:006780bd91e13ff5f3d62d5cb4cac152a13db5 -:00679094a1427dc58dd0916538e88bb1a162e4 -:0067a0696909acc442004ef22a319b0d0a75d4 -:0067b0bd633ec72eaf5634662272ad5be61111 -:0067c0c0021f2bd9540c611e27018ad4e03038 -:0067d0182f97d272d97eab923afd3bf4687435 -:0067e0d13db3eef877c0983a7eb57c611c96cc -:0067f02e29b7522b5ef336f779259aba4d5776 -:00680050c7ec7af3ccb4ae0a983dc8a23a01bc -:0068107f7e67c454e9dc6ee6c1728255877314 -:00682071db57e0913403a06c477feb1b5b99b0 -:0068300393156a247d90c9aecd306f37f9ce4a -:00684098528968340dbe62337c186de1f4220b -:0068508d0f9c39409babd015cfee9bc460e928 -:006860777fd82f98c0d8e1cd7c940c2b023e26 -:0068706c11471bd6e7bc5d87873e37a9e9af12 -:006880ebf7353c24c496e27d17a8cd10a9595f -:006890d180017fee4fcf4b7f450210cf91f7ea -:0068a0cc49b5dcec1273626d6aacfb0a9a6dba -:0068b0ace22e11fc5bfdc62467fab9171c7fd9 -:0068c01ed15e4430109a618adf1943c4ea5877 -:0068d03a70d56d6f1a61eb20ea82abc8fed16b -:0068e0dcfe2ea6f04b771938bc83442004abed -:0068f0622aa904e195eb83e8f20b5d3655ccbf -:0069006579f95fb474469320286b7bb4159687 -:006910df49609fe9aed309a8d8976cd8b1abc9 -:006920510d4d76c66dd2ef8e23e882df816dec -:006930e81a0fb623b1766230c4bc8443e3760d -:006940d19d2ec902fbdca38e35f3ea0b83f02b -:006950cb62c62b872b5dc20dd943b0963a19b5 -:006960ccf9fb694e012810c5bcd3f0e9e98f90 -:0069702db7f2a7376697ae9fc177b6af62cc5f -:006980752a44039df7368a90d2a36d498db13c -:006990e35c0c2de456c2a9b0b615243d22575b -:0069a05ff48460d8a4db0254e0205f5cb5001e -:0069b0de5d617ee53780bb59d46df2138bbcb7 -:0069c0b37532470ba72c251ab1df6cff39a850 -:0069d089dc68efc1527112b5069792bdd851a5 -:0069e0443b714376ebade55555f32b20436409 -:0069f028bf583782e1e8fbd210979674056209 -:006a009535a9b41a142f331763a10841582ec2 -:006a10786f6da58450926d341b0e027ae3e84f -:006a20271746fa8f0098b2314cfc6ec76deb41 -:006a305d8e2582b481fbff8d1700079969bb87 -:006a407ade995646c975b8976591c7dbce028a -:006a5033686f8788b5705483c490a85b6dd238 -:006a6023c14254b5d9177604f3a5fe3857c6e3 -:006a70a24130aea2284c049f86dcee65913eac -:006a80e7563e29d9a0bd2b580e547b91efe2c6 -:006a909d03055a2bc0125798130aef6e3c824b -:006aa07a1cb7f356406acd583ce6c1ba1de30d -:006ab0fda8ab9b4f24eb6aea03b76419e6e9fd -:006ac032d0030e9fac53b5640f5fc2d1449518 -:006ad006faf0d5c407dce221d5259f8e474822 -:006ae086f7bd81c3bb353f766665c3832ecc8b -:006af08d3e9f03dde36028913c8ce5f29afcf7 -:006b0065af63c14931fd32d23cf33f87da3d7f -:006b10c97b67ba55e205554415997b450a42bf -:006b2004e76af4a11fedea4fa4cfa3f4dfe212 -:006b30eb5de9532b4a5d39797c74cbc8bf3b10 -:006b40235b115554fb1a54b04b0d40496a91c7 -:006b5021c2b51ffca83eaed5267c0e8bcae67b -:006b60dffeb72b3a680e3d747f2129d5b7b6f1 -:006b7068900e005791ef501a1ab1d4d4d8ae8d -:006b8072bd1eb3b8e4d1ef95a072a5c82be118 -:006b90e21742f9deb46e629e3ebf5944e2a42e -:006ba0239c218bc670c0db77179f419c01ab04 -:006bb011645f930cf56bb945edd08c01b57837 -:006bc0e240bb27cda77d7ecabacf5e1c4cb04b -:006bd026a3c9caa66ae217b9bf5805bbec46e9 -:006be0504862b44623ee1da4344b16fda14593 -:006bf0b86ab18e44af20f3edafdb70e7e8a003 -:006c000c490a7014927f8ec3d8066af3762f70 -:006c103a88799c347977728274e2876e3184ab -:006c20f26b35c3287361012be2d9f2edeae34f -:006c3003d85ebf5c91f6f8a2b4634983e28dcb -:006c405a268505be879b1bf1e59d12a33a39c7 -:006c50beed729586458f4bd9dfc5c9ea95cdda -:006c6071c5aa0e9a6323d864a601a99c42dc25 -:006c7074f1abe711f135abbc2e56777b317735 -:006c80c2c502b9dc3ee461f1f390c5b2ebd144 -:006c9089b291a5094ece0bc0733286c03ad8c7 -:006ca0565773d9a25891138a0b06e6eb8e0798 -:006cb0c1d80fbc2d47eec4123c5801daa9a876 -:006cc0718a69e60b9200b882f2790bc6b5e426 -:006cd046f734a94a55b4333b38e8a7fc4b1e26 -:006ce0e141349ccb962ca51d15371b20081a9f -:006cf08973c817a414aad132b9c651a475b4f2 -:006d00760b51bf91e2861b8571c3470f792de3 -:006d105525e5dd6ec02a87cce82f386e65aeae -:006d20e13365f602332c240c157c74b995f8f2 -:006d30e58142898e1201a78b04f400bddc6f2b -:006d404fde8f7f5bc98969a3f10e64ddbbb64b -:006d50bc4cc1d53ac97e63aece570a18c6873b -:006d6053652451db7b180c1f624020531d16ce -:006d70f0ea310f289236e4ad5e6775b20a30c2 -:006d80f1545ff2445d8fda32b337e175dcb45f -:006d900807b4a4fc556c239e6dc3c4b734fa84 -:006da0cfd02553a47d88b605850df36ab3933e -:006db0b8d2ca034731a75a84ec9aae8f1ec58b -:006dc05890273fd95aa1c8654406b3c020c458 -:006dd0bdd673271c2077cf8165f11f90eed4f7 -:006de00157d8744a085f38ddbaa46685a46a1d -:006df0b05eb68cc33ab5cc11c0cbe4eec31a38 -:006e0028a143a5652f0e6f6d44b0194fda8f97 -:006e10a43d55eba0e200816dd2b9f1f8d9c746 -:006e20633f421ae48d1e698803e1373fcaafd4 -:006e30e6c9189b831a302e50641eb402518977 -:006e404f6c3f55fd97ee3be81ef1a514c2529e -:006e501e5e7f1ec3949e784937afc2a35e1f9a -:006e602376241de91e9ab7d6efeae0a2afb601 -:006e70aa257d70c87d1a47b4bcede3f2fc6d7b -:006e8003182ea556b7d02919b6aa0d5476390c -:006e909f797c065244f18063572935d3aceecf -:006ea0d63873dd6d5755164ce97bf1c9f49178 -:006eb03fda58cfdb20b1182d0fadac4690b100 -:006ec0575ce67e999fe226d00d3eac099d36ce -:006ed003927858ae8a9f1c6416bcbca95f9811 -:006ee0e3291da713f7f416e52f818cd7693a7b -:006ef03aa4cb57d0ff79b111b9e75eec1d19dc -:006f003cef3f3dd7d1b40ba3a08f5703e29858 -:006f1042077606d64619bc135e8c368ba6348b -:006f208a639cf0d7ebcb63a9e6139430cb6712 -:006f30d5f5f51d3f566d4756a23cdc0357c864 -:006f40ca9957bd0c2de291d8976216e6f41217 -:006f50b2d4f2507395438156c2f3931230f5e4 -:006f609c8eb5983d6016d0292529e08595335b -:006f704554561444252557bda228a576ee2070 -:006f805733c1e59492c47c463168c341e5ece2 -:006f9091313832b383ad9e9437f321410c6552 -:006fa02e5c2f03f3d690e8bd148b940550e075 -:006fb007534ad4fff0bba27b7761f7d0a9d4a3 -:006fc02330a95ea01d880ffd4c3959fc80fa9c -:006fd0a59c2bb1b9f575edec97035ddb451ab8 -:006fe01abce6dec6ca2a6572d5156d7ce5b2c8 -:006ff0b0b0516378eedddffb348b3ddb791878 -:00700005154aa11d1c5eaa756e39970d003c9f -:00701006b38ddae6cba2970577253a39f7de6c -:00702065c9a950bc61098a35470df2f56b4ea3 -:00703006eff4835a892418d72d06613692fb3c -:0070407a777e57577d03013fd02654d832df01 -:0070506c976e713276c69280858042cee13324 -:0070600fa4ca22047653a1eafd748cadfcbd83 -:00707040e06fead48e86c0c056f620946fee52 -:007080c88a5864ba6cf94b33e9fe14a78f3881 -:007090ba13c85c02ff8a0ce3decb6748ceffd5 -:0070a05ff03dbc94c274164a3b03c1919221fc -:0070b038df21670ac15795959fada507539059 -:0070c032df46ec153d37b0d38b60758330c351 -:0070d007dee7131653e65d1d71331d73603559 -:0070e0cb41fc7a9353420ca989777b9a5fecfc -:0070f0d1138765cc4cea0931ae152e0f10f1fb -:00710086ecb555ce8cacfebcc37a3dc228d8fd -:007110a54182ccff6d0a0a1230ef209358a0b1 -:00712049612cb14feaf8f73197738014653dc8 -:00713004c6b11d49aa677da8e40057c1c9c4d2 -:007140c66608db6de2d916e11a6131006e65b7 -:0071507ceaf0ea4e6b4d9de461f3335a8792c9 -:0071603743d2aec9ea23877522301a968337fc -:007170b9e4d6cc5bec365440343b4e8b28b7c7 -:0071802a11d4a55373b447229a6c915fe0f5d9 -:007190ae752a14c16845812f05411fe5f50566 -:0071a0cbb7468130ef9c08b8528b53917546dd -:0071b0ae7855e11e593ed5cc6e52af8fe22753 -:0071c0eb501c861145add58b7b66c71d9291c1 -:0071d06ade974a6f79e9446a139751b593a5af -:0071e08d1bfbc6f9c1f2e487afe3fa8b73eb6c -:0071f023b1d74cb66584c6cd8c0c9a16627545 -:007200d9b404b6c1a87d1985ad243104fc0560 -:007210ab26ab9a184f719241ee640a9bb5544c -:007220cc50c36de83010818f6187b148717865 -:007230833e34d24e6f6446d93874aa4238c19d -:007240fda8fcb5ef9f6d35870a3290538eb7a1 -:007250a9f8b7a55d9f4f72f98a1e7c10154a10 -:007260ea6b7b52101ef5b6985cf735acda3f6b -:0072704f6133393e8acfb07d0ea78d938a5545 -:007280130bd000d21b389312b01f8e0bef18a0 -:007290bbd0e7a81c1de99a8f06e81175995786 -:0072a0fdc790960bd1d5831be5690a997ee54d -:0072b0bc0bfc2c145ca3395abe79dbab6276a9 -:0072c0fed86c9031bf1c80afa4e00a2b0d80eb -:0072d07f40ada29e5f56e881bdc45d29003437 -:0072e0387510915676623e3083b7d702aebb17 -:0072f070d5342f31a20dc929dff0757ad13ff7 -:007300af24166f7dd6b527fe473623fa526a3a -:007310a4adf734413389ae3745f0d7c3f28086 -:007320a9cd50036b43772b6b1c772477c2de58 -:0073306047d0324ea7ce964a49a51f2af427d4 -:007340dcf08d92060241a65eb880b21ffe6c34 -:0073508a260a6165e6ca418dc7d611dc8bcabb -:007360fe07fbe16e6368def332e5d3febcc10a -:0073709123cb29c3225593754a3033ffc2c81c -:0073808b98dd54e213e09b1439512b4df923e3 -:0073909429577a73a7f6837f90728c9177e8db -:0073a0aaaf159f7fec07ebb35c052b6d92bf8e -:0073b04323d36b9f9528cca73186f96c8c1d3c -:0073c0a1a794338ed3fd0ef5a4efda34eac32b -:0073d0db738bc7edc2cca904a8b28fae36c498 -:0073e0f445de2874580536c52529dbd9dd582f -:0073f066f8d60ebfbd5c5d83adb1a77bed02e5 -:007400b73cb7ce66b9d788542847b335ab8f54 -:007410fae9e768acdab9d6477ff22391addf43 -:00742075265c64e7b2d03f94a8e7ca907c1e75 -:007430194f102eb6ccfb2aa90d470f9ade9715 -:007440c50cee22d38c6132850ba059c4f5ce9f -:007450c367857a85bebced7163edfd36c3fe24 -:007460435b7a4c11a1c70671bce3986e4cb0e4 -:0074707e1d42e1f1d30ef8ab8a3a1533856a6a -:0074803cdc7a70c82e7ffb32f75053469821a6 -:007490d26957595fd13504b2d3a8af98e5ce84 -:0074a02813911dae8c0513618b29e97ac233d9 -:0074b0e1f014fae11583825f0a014df6b392af -:0074c0e88b52b05f327e1d3fc7d88002444aa7 -:0074d0b6668e3af63d6376a0a2d2dd5f995881 -:0074e06666c44ba2c388e29da0cd8298ca3031 -:0074f026e44822bf391f606650ba94c271ad54 -:0075008200ecf37055b75db3826c3a3f42bb5b -:00751066effad645ffc311e7f7fd59510cb595 -:007520331e35d7eda09fdcc7fe8b0622a6895b -:0075304d0cada5634b1bdea3b4b3ebba50a0b6 -:0075401ccadb15dca0b0fcb3ec99cd4cff5314 -:007550ae2667224a0e5f78ed5529f93826b620 -:007560c0d34f26ecfee5413a2bee180862099d -:007570bf7be97cdbbf32a6c82010132c681e04 -:007580d1e17da9064ec10bad5dbd8fc2f973b5 -:0075900f364f309e2e47bf2ca1f20171fabc8a -:0075a05b20c1d8f79601d89a901464752493d0 -:0075b07fc94ca679c75023197d75a385804edd -:0075c0f7206887c71d4d440d336e775b091f95 -:0075d0f3f005641a84f217f4817e42c78f32de -:0075e05eb0999029d220663ebb2e6030f3aceb -:0075f01600488a769e32c27cd2d2ea05221afc -:007600bb49200d2885aaff1b6a2f455716b08a -:00761089c019eb87d9d92912aa34938de92375 -:007620d9d2ffe1dce34bec0c7cb5750f4ea4e4 -:007630d3768fc0e39cddba284e8019a42fcb6a -:007640d1b916b520bbf0b05a9f93153be9607b -:007650e28d085517810e2e8616d318e78dc77b -:007660ff6fa30e0d3bff199aa31e72e3a5bc60 -:007670900ce8004471ec001391edbf6835f66c -:007680b13ce755f8e82cef566c548d92bbf23f -:00769029a11d23cafe267cc82f515332a3da20 -:0076a0c2c921bead9c1d57e4b270638bc89553 -:0076b0f284979ce4395970c506f271c9bbd1e2 -:0076c0f37b11c584b9adc3d7b66d361533b7b1 -:0076d0fadd6aa15f30880f4e74d6b0634bc487 -:0076e03742895465f1ca358527a0b536dfe7da -:0076f0cf2ff038f58f1fa7df8e93c96201ce72 -:0077008ae69a84496f4fc1a0ac4473061c381b -:007710fb2ec2046f9eb47e3a482b1f402620ac -:007720656e306f42f67cbb41eeb9487b852a2a -:007730e3c649da2c46ff62b84f82b882078d81 -:007740d5e18b5c9e2871e07db04dfe035471f3 -:007750f8ae4646b15cc83ea13b07f75642800d -:007760508f5e1ba791c889fb5fac563413afa7 -:00777059e76cbbdd0e82fd527d087f8db60004 -:007780a4f01a1ee6a0d517ddec346feaf25c8f -:0077900539562e78095549a4bff1d91bec3bfa -:0077a0cfe723288292af6a12bc097ae6d4e883 -:0077b0d2e39dc190665ddb55d228348ce70c2d -:0077c01a256ee9375a3b16e0d621c2dd9c8e4c -:0077d0c44c4d069ed6e03f5d08c0835049e41c -:0077e06aceff85d8e173527960350ac0433137 -:0077f0a92d6ded739beceeb0a61a947bab6f8c -:007800e238e708fd0c6640da10d0de44cb2452 -:00781045b1eb449b3460d138cde2c572e13fe7 -:007820239252039e6561007aa742f02ed232be -:007830452df505e7e37bccf1a28d93806412c1 -:007840de8a8db96679ff9a7c7e1b7ae842b6de -:007850883d0e3995a22cbdf06ef31a17dd4a71 -:007860647be419338e427cb150f0d325455a94 -:007870b24471e44cff49383196152294859328 -:00788079dd45e0129517b1f9841c8d917d25ed -:0078903e5be12642c7011f19adca92646373d5 -:0078a08e420712b2de031236a83b7e240adf4b -:0078b02b9da3f584d1235c76cc728122b5abe8 -:0078c09bc466322a19e4944f251b2e3927eb24 -:0078d021e79e77a6d87c909dcddc68befffcdb -:0078e0b1f1ddb7ae03f882ca13c3affcf65cc9 -:0078f07fa19aad85d594864f177e71a28ecce4 -:007900a2e1bbedad545dcd3c3caad3fc398fd9 -:0079100d87c85a214e2d6f39139bdf07a9daef -:0079206683a86227be05b74ee8885148d219b2 -:0079301f1d650af7770b47e2ec7a207c054dc0 -:007940bb373eb1985f736a4680bd24ed356cbd -:0079502a33bf6fb399a8ded3fdf7b2b47b3955 -:00796095fa3417c7f494ff914bb885ca84d8c4 -:00797048d2c0839bff52dfc1a3fd64aa3ac69e -:007980743be8997f7796c66cdf42db45aca413 -:0079901255c1170ab3189cb7fd720689f89728 -:0079a092e8d8fae7b4441e967c5e3fce8fb43a -:0079b0a8938895217161759a7abdf83de5b294 -:0079c06ff682e9e636de3837d1d2f84f569b11 -:0079d0fcd400639b2117b8df2fc473b47db602 -:0079e030a8f7b63699845d0d3cf6419193919a -:0079f0faf5806f68c80af1e5c1cbd620a3e166 -:007a0091011247809c852e7f009a188a0ba1be -:007a10ebd6cfe07e2d274d061807d624f9d24c -:007a2071fffd048f08940d3cd3a2afbd21039d -:007a3019c7aa986d7b6af26121c7a1655a8e6a -:007a409f73bb3be1900f69def684e35e5c5c32 -:007a50f8bef72e777e3d8e4dbcd3395c7f9827 -:007a605ae6cfea1a9fc8c897d2adfd89618847 -:007a70ca9689750d85be9d0f23c651a8627d05 -:007a807d3ccd2a78a0ae7d1c4958feb3c7d199 -:007a909460b92f0c9a5b7cee85ea5a295ab103 -:007aa00c44ab1657c08801605e3240b3cac7f4 -:007ab0af8f7005fbc51cfb9a59caee4cf0dfda -:007ac093e443a00221d4a5923887066f7e6a29 -:007ad028625a6ed8766cdb06c27f17b51e9794 -:007ae0031a8d5e799fb013160bd76b51caa359 -:007af03f4271cbd509ccafba2b0cb779d7863d -:007b0068a0b229ada40d55145a19f10d722483 -:007b108ba619d15ad0c11032ca51e02d4a6ad6 -:007b20dd0c0ad32b42d5b608cbbc3be7a1526f -:007b300f1c1c971d38b6fc2bbba275af22b625 -:007b4085096db3a697a9a19058122fa231d6a7 -:007b504fdddc5cb18c0ce27641e28b105763f8 -:007b60b48c79eb9358e35a2e9af2699fbb04ef -:007b70cd93774c72cbb721b6d536bbc7f280de -:007b80fca6b6b1048483bb6769acd8f0b553ab -:007b9098fc6a5fcb6a500592683c60890bb9b4 -:007ba0a4a80b7b0163d536b64caa45d929dd96 -:007bb09adaf4778c5979ae750e802233dd79d2 -:007bc0250c28b1ca6b4fbdb0b1e0a039e24061 -:007bd094d7a81fdb34426297c0ae0a7eb30cba -:007be0c685e9f0afe0e4a466d883a813243ce4 -:007bf04f91cb3cec93dd599dacdce1e936b23c -:007c00a3f6aafbb76c4ab8502531b2f3ccb95a -:007c101131b2ceb98e9c2cec08ddb4796d8f13 -:007c203969fe6a69568b6ed114f94b548a6eab -:007c3018a003c119bf2c9bc4fa78e869e10eca -:007c406ed3fd3d298eeff557c3f4f1c7be9acb -:007c509e36dfec2a2fb1abe855e4015c7fbbe2 -:007c60330477b73511972a0a93832e86517788 -:007c70f9b4f2438a1c29cc4942c92ddc0e7bc4 -:007c80beaf481da7f4d83df547efe2bc2e8e05 -:007c903f1ea4bb49e3d97497fd96547e4d5837 -:007ca075faeb23922866ab439d3c28583b609c -:007cb08dfbbe3d0dca766c98f2cb28bf98c8e2 -:007cc04b5530d8ebc0f8bc17da3960ba4a2957 -:007cd094ceab4e3d5a4a0b76acb20ee5ed4dc2 -:007ce0d0bbaf5620582f0ea10cdd6f22fa24dc -:007cf08f4e0c6feca7d9b5a3f84b0049f28041 -:007d007ab3d77e7b80fcfb2eae8450f927bdba -:007d1050d18040c2cc71ecf603c0376ae71e11 -:007d204122373986a9cc1c67b3135beeecf45b -:007d30cd4d12f2f3bd8b9c89507c85a00108e6 -:007d4078d93e37de816aea9b224f94a0e0dce8 -:007d50560ac34c7dfba97c199a6547cfdb39bb -:007d6028aa9701e92f8ab7e335e73df268afa1 -:007d701e98993020b3fc7ea92afb651821cf7b -:007d80ffce4a11904b609c04df64b725554195 -:007d90ae849c0717ad9e49c26249ad1efe795b -:007da07c7926a0b6484e39bea3ed24209d7c05 -:007db0a6fdaf9821c43d71b9d2993634a38ad2 -:007dc0827e5565909ba6a34b4f5fa0882780fc -:007dd0640dea1eb4262f7a77d183a260ce17e5 -:007de0c45af1f2311bb6b3ab9750467b0ffa24 -:007df0d88293c50d4a2448f3abe557b61abcc0 -:007e00bc55d450b72c7020455d266c2e1c8cd5 -:007e1017934f13bcdf643a9c185e1e9cc68780 -:007e204b2882b5b98ade95f7f83854362cbb7b -:007e3022f0626816e3093d85ff443a2264ff5e -:007e40a7c7716d329832d36d7284a0e84fe7da -:007e50cbd701ff927f9946ca2be3908bd15dc6 -:007e600fe7526355a8c479d1871c5b9c9208b4 -:007e705f8b7577498cb6600bac21642e019bec -:007e80beadd8d4e2fcd3f1ef411243127bdecd -:007e905c39b17c09d42449e8303e80cbb11b15 -:007ea0d4093a37530f68cdd53994ec9d13dcb4 -:007eb0128ffee05befa983d0b62b3a4074f105 -:007ec0115399a6c4f1ff0c1800b34e9b5ded9b -:007ed0d5725f3cd3f945c50c13df34ab80aa53 -:007ee056cff15b5f2e803da71410967fe8377b -:007ef0b6f254e3bf15f1b406b31e5f9e7556dc -:007f009f9912c5a560e7291d896fed2102ca41 -:007f108161da2e098464207fd95ca84c5b851f -:007f20842aebdcbb8d5a4231000f5cd1afd14e -:007f303d0a544298faa213033d00573efceba8 -:007f40bd30dfd2bd2ae1f4e916406720436ded -:007f50a30556859e6e4aad8d90e35d27eec6af -:007f60c4b639c064d9dde53f4c4d440fb3dbdd -:007f706b1eec78016a322d8b8ea2112022f531 -:007f80eea9888acbad9f510d2aa17882ef183b -:007f90c65530bc992b0a8200d6728dc84f200b -:007fa074f932d331072d1282349f85372a7e1a -:007fb043ee6bf88e377384ff007dff6df1c35d -:007fc0b74ae5b97d2247050d041f780d685b46 -:007fd0ba40cd24e596fb30c37a3cf35feb0183 -:007fe093db948754d44f4422f68c0e1e182766 -:007ff021c010dcdd17ef0ce2e56d79ffa12ecd -:00800009271a5fe5ad513cac56b36ad7bd5869 -:0080104fcd410e22dc017f51aeab080b858bc5 -:0080200c0198c007dceb3baea97b2fa5531587 -:008030fa7082bfe24f18a7c2c2b5bcdd13def9 -:0080402e1ef0073c2c17e3c0b5f352eccc002d -:008050c3ac934b1f796c64ec58468e65493f2c -:008060c46d7b66700c40344a601c6fc216ef3f -:008070bcb5984a99149a00038fe2e73be3d543 -:00808042bb2f6bc890f0edea7b7438b484bf91 -:008090b2687ed0d40e05a49793a41618ceea79 -:0080a02819d9fea9042b82884e958a17645f12 -:0080b0bc34b06038f25a65ada381fa65744b8f -:0080c06afb53765f6b103967de27cb0e4728cd -:0080d01ce044d2fe02606597b04b849de5d17f -:0080e0d426046b368b068dd436f1371bb18b8c -:0080f072552d446aa25e1ed58af41f74727d15 -:0081009d7869744993cb78ba378356aa053e37 -:00811091d0a6cd1ab6059d42e106559d566c9d -:008120e2cf31599f780cc4163b6cd572b9333a -:0081305ed3fa3c9507a5f2133c29d7d6d67076 -:00814006f2f2d192d9accf6bd2136789138a4b -:00815087cb827af59b5b307b2465f5aa7d6a5b -:008160cc72c95b969a2fb88dbaf41a659c060a -:008170b69b0f409b53b6bca3c09ecec0023389 -:00818019c3f705299528031bc036d899140521 -:0081902b2d68075e16c57a6625ef6924a03c07 -:0081a04a91b0aa79ec74bef874a3824631e67f -:0081b068a92b4aa29f7a8db213b1f79eb143db -:0081c07f17c2483d87375521abeca702a983b5 -:0081d05495f5d198faf055bc40d4980c3a9532 -:0081e0c7b3809d88955930da046b983018b8ff -:0081f0d520fe4505b074ecc0fa19a16f258573 -:00820023ef0b136c4805e24d67d0c3060ef19d -:0082108807adcf4e7d250bdb75a09275445f4d -:0082203aa32cea14048f47aa08e431abfbbe0b -:008230116803a9bced3f5284542aeb19ceba27 -:008240107e43863ca6134d26121ff22b0644a4 -:008250da462b384cc30eb2c1c4745a1234a7f3 -:0082601d6afdbd58b1c3bb868c5abb38a3baf5 -:008270031e3c92bd5eeddf180edf8d322d735f -:00828029757aa856af033ef6aedf9329846c21 -:008290917b45ee235c7c50a6e90dbc0d521a76 -:0082a0c4269413d4afcb082886b6a15fdab34c -:0082b05469dd465215b03b7fb4f217b185b279 -:0082c0b1fd6d86470d3c73ffe97fb6af0211ef -:0082d07f8c51470455cd73241b27e11f17944c -:0082e09626ffa295c63b1a249d95d6c152ea94 -:0082f0d1423af339f5df06422524b4e4e3f6af -:008300867fb5b5cf6c7b06e1fe80964b214be0 -:008310231f54b493ddd25b87abd49a34e9b4ea -:0083205772541501cdd1a69c138daea24f8c22 -:008330993703e049198de589996335ae36c366 -:008340d58fa5af490d3b97e065a3242157e6d6 -:0083506677053ab27ecc3174ee280c4f077162 -:008360a2d64aa2480f54ae13dfa8dccec8e031 -:008370ba14ac8cfb29a4389f105d172014bf6d -:00838081286210b4950ae66794ff9cb3f237dc -:0083904eb2c94d6ee35149d8afdd85f87aea1f -:0083a01b61dfafad3b2436246274878e264fd9 -:0083b0a6c06009c66add232899fa09b948227d -:0083c03109b6ad5f596cee4461c8cbdd4e0f78 -:0083d04cddf75dfa717a610a4f51694228f2a1 -:0083e092beb95d89662d621c08c4051169810a -:0083f0b90e306e65c18d43b7495d9c68bbbe78 -:008400bbe7deb0412ef74c51092cade9471fbc -:0084105ad1768c4222f904b91c9317a476389b -:0084207558d8b59d394448d42c78c1653064eb -:008430ff1d23417166eb331166dd7d8cfb6d86 -:008440e61aaadc5485948f2acbe841bedea927 -:0084506fe2150d589e4a61329b4987d79ee810 -:008460a50cfc701be36ee1d6795d79a5e01c25 -:008470114940d913efa46ac4bde6b9e0dc2ca6 -:00848008cb996daa3d3b53c5ecae59c331b088 -:0084906c3c8f7056a8934f6e72a8163dbf414b -:0084a0119393e242eaecbc361232e3773ddd69 -:0084b0b8971081f9a9eeb6c9c5e42e9426c735 -:0084c00cf2b1906ccfc0b554ae07bccca60834 -:0084d07ef576313ef132cf4cf02201f6073982 -:0084e0624d6332ae243d90a024ec33888fa239 -:0084f07cbee59973ec41a4ab55896bf8884327 -:008500001fb9a011adb5acb67dfbbefd0f2d9b -:0085102bbc696f9816c2a0a69e24e2db4c1e87 -:00852068fb7bdcbe64411201330955e0cebeab -:00853083260837bf4cce54b67785a5a895632a -:0085405af1169bda82c6c3e975fe2433746b7b -:0085503a6fb09eec9d26245d43ed531d3d7411 -:008560093a8ee53d4c830fec4c4a3365055e3b -:008570291544d37f6c6be35b253e6c6a7baaba -:00858001f138606cb0865457d8bd1c69a59335 -:00859042dd0a64524418c91c9e7943aea1d1bb -:0085a0cec16aa5a135ee5979c8151df051fb0f -:0085b0c025a6df6c230a3ad15695bc531ca7ed -:0085c08e0e2778564732aedbc0b13458b46bd4 -:0085d051249f88c895d6d9693419d623ca1dd8 -:0085e04f5bf4cf958f2e7fee436904939ed61d -:0085f05676262bda02318310364caca982934e -:00860095570ee1a77c85a52a93522696b52a61 -:008610a6e2ec097b039b669f5f3967780d1a56 -:0086205331420d31b591a79d962ac848dae697 -:008630d310eda69c40821f0382cd3f7a491e4c -:0086408e7d47dcf9605452a549d1f667313bf2 -:008650688d1463a80891c81f5e3582438f87b8 -:008660eda316bce4a75e5f3bcfddb8df41dc7a -:0086701d758dfff8e90251e686efd413b5c2d4 -:00868095f1f82b111e00ec233fcd8316713cda -:00869080281fd384698702c0431c2fe354f986 -:0086a0615cee01aabf2f881ef56857d2a0be93 -:0086b012d5c64fade9df46ad36df58c418230c -:0086c020e52efdf239051c2884cf976191dd0c -:0086d0ada0095819194475e68e3a773823a630 -:0086e095898971b99acbaf8f629fcfd5a899b6 -:0086f0321250b786958c94172b6e3177febbf0 -:0087004157c69d731fbe5c52ff8279ba428e9f -:008710ed31e70cef593d76f14331632db4a802 -:008720c980bc866454f22108acb2feb20cf5f5 -:00873018946877bc4d7006b03e4b83d9194e41 -:008740e2f3b624373f0a9ea3334105b5adbbe6 -:0087504c6d7403cb51d083b0dfb353f128a624 -:0087603036626737ef52ff058971ccdc91e074 -:008770df4bc430406e7468c87627398c50171c -:0087809950ea6867341c1a938e8e42657e5e67 -:008790c8810bdcda6a7e9e1f28fafbfaa59d00 -:0087a07927c63e38bd6d80ebd5fe5727725fbb -:0087b005290e24d1e453d280ce1f8f38842f83 -:0087c076590f1d9f61134361992030494b67a8 -:0087d0d6a033042e7ee417279f3f1fdeedc80b -:0087e07c2b4d3a3bb37d283745bd6289e32a02 -:0087f01652d71f7c8d3e70a9370ee317c2864e -:008800ea54817fec121d1e5bac7449bdc98978 -:0088104c70a911aca7eb80fd52da1d2c169e34 -:008820cbc4549d8d8766305faee2f77c845f1d -:008830319e5d8f6f0e296d9ee6ba424ec399e4 -:00884080807887a5d24bc258ff788364f624b7 -:0088508feb0c05e6842416e13ce0201f67a8c6 -:00886024807e3feb63905fae7aa8a35662d888 -:008870f3e326b788f11d653655192a312543b5 -:0088802881c18b7095ca7310c323a434df6f76 -:0088902383e1f7cb236f89cb2c24fe4482e237 -:0088a032f6786fcf367873809a8aafb276e5ab -:0088b06ee720c3f60f85b76be77c47aed9b5e5 -:0088c020c4cbc72898743b94d94ded044848af -:0088d036e0d1f7204e9cb65fb86f6c5befcb91 -:0088e07a1a7fb11745104d66ac61c850d3987b -:0088f0bc9da6aedb8ab0cf2c06742a7f54f5ed -:0089009fa5f842c092f6cae1584ebca1a40161 -:008910aec2fd0b215bf6acb4af7d16909edb4a -:0089203155b85aa5044ba29458f34012d611f2 -:008930718686e6be172ddd1180fbfc5ff81a67 -:0089406a2e847884ad7e94010c98fcaf7aa78e -:0089503e4241c9fd10f711f04f35babf9152fc -:0089608b0f1ea0a7548d0ec1f106b18ee02b5e -:008970a198bd226ec48cde4e5d67c37e57b1f0 -:00898022c0a30c4b05f2c1b2b33c61fb1401ce -:0089901370f63d93dda2fb1e7a9cddc601d119 -:0089a07be78f37d42e3860edfcce550ae3210c -:0089b091bd13929de080de0a3569e5fe91b2bb -:0089c0e73a1d96ddf378ff0208afb0941c61e2 -:0089d03723de833cb46c05f5d9f84f59a40e31 -:0089e05a37ac03dd86e4c1c16fe010d6284c5a -:0089f0a4b01ae97856d0221223c7b7b431c36a -:008a00339f472c9f2dfee44fd77ef15d99582f -:008a1017de6f67d690b58a4e04930778539c2a -:008a2078df7abbc3d4f4a82b6f8dd3cd924be3 -:008a301df92a035674ab452d814ca6fbead2cd -:008a401f8a73398c805cb15ddbb8bfb4472565 -:008a50b19b2798afae859f2210dc44fd6eed14 -:008a6057c869d0f8808691fc8225fe5391922b -:008a70ee9d50569a886f0bd1ec5ff489f0848d -:008a8046d3d6857e5ab14a0e2317e540faceb4 -:008a9032867a0e5c7385ed4bacd86e56278a4c -:008aa0655619cb893f7805baf2f297058a5f74 -:008ab0b145c9cfa4fb635f1afc531e09fdf2f5 -:008ac0cc2feefc9f08dc4ecb3130ae004ab41e -:008ad049638d3a645b1333d5371c47d10afca2 -:008ae05cdaf773c8fae284253373ee6f4a6eb1 -:008af081823b031a1648c27b586e7c1ad8459c -:008b004759a5c855dd63fe1568bd38c3336358 -:008b10a350a0c9ec00a0df55d4be14025e0ac4 -:008b205648bdbfe1b54e5986fe4ef1e0869829 -:008b305e553d390f230788e39ce9b2d91dd930 -:008b403a53b295ee083e6d5576376e39d97a6f -:008b50040c6d93b142d5ccdab2f1434db9a71f -:008b60921c91991570c5c77dfb18c160b8ee5a -:008b705169a1f49cb1b1878000cfd52510328c -:008b80dc96a2da4d3cea6d99bb57532e8193df -:008b904ba158b080f50cb5afdfcd9e6b80c455 -:008ba05cdbb618a803b5487892caafff14c1fe -:008bb0757b4e86ea6e877cdbfe56da2128db8b -:008bc0f36df73c0fe4829a2bb240902eed96ca -:008bd0c469da3e72077264ee847f134e9a58a4 -:008be0868251eb2ae3736c4ea8dcaa7c051009 -:008bf05602a79f94893b6e40993c5cb29f12bd -:008c0026d3c1e2d0d7ddfaea3cb5614b85b817 -:008c101f6927ceb5143bd1824324d57e87c612 -:008c20d7886535a1289bf01d5a40bc9b35568b -:008c30259739928a8b07febb263a28b0d7e9eb -:008c4028baa19bc0d3da8f72b319c48bb2a04c -:008c504579eff34a4d87d6b8f42c164f733e39 -:008c602aedd0397570b6c97c6ca0884ace685a -:008c70af6e23a6ea830a512224a38db10678b2 -:008c80630fa6263e98551d364e84858719c1c0 -:008c90a368e74a39fc446e8d0b98081ba6afb9 -:008ca053da82cdcdd8f2159cbbb2bf76306866 -:008cb06143b27467c04ebced617cf043babb1f -:008cc06be75ab57f6a55b60903b07026c82e21 -:008cd06d1e0e1f1b3b8f60abd2e545a26cf91b -:008ce0af6b11d591188f19c7f9c29c51a2c306 -:008cf079ca29d76432cacb9007f00ec9c9bad1 -:008d0066138bb288371872615719f645435473 -:008d10f0e1d93fd0571c275165d325da1ae843 -:008d202e6d4f4954529286b3123654c0a44284 -:008d306f9cb75483c30baf2b1e60812483e810 -:008d409c6eed06e19d48f98d7e5a91d426011c -:008d508a1898862ba53902b61f54892ab6cbdd -:008d6037eaaaa7e4301ad6e461823451ea8b2e -:008d704ffac382828cc7dfb9f978487c286d7d -:008d806603b7b64683151ef3ca0306cedd1700 -:008d90c00a49d6e2a2459c10512dffddff60b5 -:008da05328df7ad8240cb0c6b0b812bcdc2117 -:008db0622bafa396a198bb7d7a9c19c64dcd73 -:008dc0cd9a9b20f747aa397f5de24054ddccd8 -:008dd04fd1316991f7ff4e7f7c733ee02ae4d9 -:008de076b47f13c2bf8d3bd5e3b98be1db228d -:008df03862bab12d055e455e28bb77dec3e6d9 -:008e007915256e9a643cf7e523fbea76bf811f -:008e106e0f145c520d57f1f507136964752b72 -:008e20bf2d783a17424dd0e41d2660065aad2e -:008e30f43ae7669380012aaddd4885dbbb8346 -:008e40d8f5c9e6dcdcfa80209d4247d3fdec6a -:008e5087e14a04c0d6794609692ba0c61178b6 -:008e603e5cbeb6a24daf3054ed5bbe8923ac36 -:008e70591ce770eebb8b2acc58ae4103680f83 -:008e80c8f27508bd5eacf98bcf23ffd07b634a -:008e90f76ee832d27cfbad47b4a0e91d3d5ccd -:008ea0442a6bff0230cdbc4305b2b223bfed73 -:008eb0e4b8e73926e88b5bfaa0947f08040f52 -:008ec030df881d9bca1ef5bc05b92dd68213cb -:008ed0fa77685f0a972c7bee5c6292f7318b0b -:008ee0a66ef6d633e60d37d2068deb1c2c57dd -:008ef08a6fde362e26db80687dcc233b90c7ef -:008f00eea27cf986c61fe6523e1a0b7d606085 -:008f10bd48bce5de3f15605a2b533b42116b66 -:008f2030b77ffc593c4fecc75a120f21a9d231 -:008f30152cbeb7e9003fc5705d70a09b7b1b41 -:008f40fc7aa262278a3753ab5525762f06f1aa -:008f5098b9b9e5dd968db50d61438701b9ec63 -:008f60b47b02d35dbea5e0bc5af4ba9f120dfe -:008f7015816d9b7738b6b5fdbd659cf56d5156 -:008f808edafcc22f426580be05742b22f0ed6c -:008f908bf2d50589e2cf635c8e76c7fe55940b -:008fa042c722f488b6ff7b2ed40812cada29e4 -:008fb01eaa243ba3e7384f160b041227058b2b -:008fc0e47f086058ad310345a24c23aefabbcb -:008fd090184dcb98e69e62912cd0f5d6b47019 -:008fe0c18cb565b1c808835a8f23166b63aba5 -:008ff0727a1cababc85eb751d975953469b8e9 -:009000c69ba9209c6606e047a17dc747c8f06e -:00901017b356c38dd46b4d69731f6b167b488e -:009020440337df170e01e2fcc4e90b3631e3c2 -:0090305a333e63a9f3e969d90c2f8ac0051092 -:0090409562b285a2463d0ccc5e46a164076f19 -:009050c27591e628de4916260624d208c53b66 -:0090603289fe982c3166bd1cceb0136385b961 -:0090706f297f73c9def285930fc9a56eb2c131 -:009080db77b3c56fd7e79ba928c634b47ba13e -:0090904d392af6a3483099e5d628dd640f3e53 -:0090a016b44a59988aa24482ee363fdb67ef1e -:0090b01e6227fec0223192dfac809c27846527 -:0090c064e87b8701240526397f9e9ffefcdf25 -:0090d051aa8de864dac7c55db07742a961d501 -:0090e0dd612fdca15e82024c218be12b4b85a7 -:0090f0b97de673cb82c9badcbcd681109dd2f7 -:009100cb454fd59a908da3cf0e3f8293586e1b -:009110f4c502e5595edfe0724cb999130f6409 -:009120d5f75ad995f80ae0cffd1c5ccfb43e70 -:009130df34326750dea69480783ed1edb61c9f -:0091407a15c4a65580a5ddb0ccf96168cc6633 -:009150a458a8e507f8cf0bb6e0fc9b942b0caf -:009160f399e09036707980b2b8060989481528 -:0091706c9f58b5a1ded47b6f95fb7641621039 -:0091803ce20fa8bbbc51eb60b3e9ea50a4f4a0 -:0091905cb4d04b592a05936c5dea865b7f541d -:0091a070044058233ba79314745254c698e601 -:0091b080d1700c1123c6735debb781413f9d09 -:0091c0e10bd54a867ee7d79eecdc952f545664 -:0091d0918a727749070441933562a68acc30d2 -:0091e0d41d788b5024429ba1c377dcfcd04f07 -:0091f0a469885d33f3634b90fa6052f2f6e789 -:00920005685d2556bd5260febd898da15df0af -:009210656d87c0296b65aa2a12ec278f1168a2 -:009220b0969c16553843558b13b43fbdb2da61 -:00923070e175a5285230ac02ec18a000c63fe0 -:00924082d09d8a78b26d8c577b550e9907a0d9 -:009250494f972298dab0fc680f4183d43d19f0 -:00926037d7de13f9fa6c0ec06e05365cc8c4b2 -:009270d2777be1bf84c9bf0f44cdcb9f4f6017 -:00928047a659ed83a540af368bef68cbfe7d05 -:0092900832b0037f16dd91aadcb84e4513b11d -:0092a012e11a802e188653dbd616965fc8dbad -:0092b0de94cdc3b606e01ed847676c9b62417c -:0092c0fb45fd43a8200e72611a07ac125ae303 -:0092d0d56c0be78ffd903c9870fad842840534 -:0092e0be3bad75e8f6aea2a3e6eb0a59d0c089 -:0092f0bc4abb59c14762f008a217692881910c -:0093001cd3c4f92cd7fe2e050850643b201092 -:0093100aa6a4b610aceb7cc345e8a346d944c4 -:0093208d4055d9d894a5a95cd50d305f359637 -:009330079dad809afe9923373555d4dfac1e61 -:00934060fe7ff493c0da164d00f5e545d0f94a -:00935006c2b72b2776901d5bf9882e1e05fbdf -:009360415e12c2d006d1aadb419102935b62b8 -:0093709ee84e2e60c29102c7eb6234d2ac8575 -:009380602cc916880e665b5f6e12e8c4053bea -:009390ec23774a8ba71a4e0911a1f8901b2623 -:0093a0c54c2bb58ada955468f0be78ce46451a -:0093b0370106f3665ad2a34cfacde64897ad77 -:0093c05c61e1a7d7b31a2e0d35502e49e2a197 -:0093d0ab2346f4354f35be172603f87ff33252 -:0093e0b73739928d6a6b9564b49706239157f6 -:0093f01fb175c72de0e53406d71c76e7350d3f -:0094007894e75fced46c79cd5b59b7e306076e -:009410a117e746b1d951714e9fc2a6dad1ca35 -:009420bf7a2bb30fd22b1c54479e05c32db100 -:009430219598fe8ef12a04d915887b52fcf853 -:0094403f588b6b44acba52f1321ece2d5e611f -:009450d92c7a5bcfba2feb57376aa83dc3e0d8 -:009460874bedcc3c8adbfb65e7890719efcff0 -:0094706e72f590d02ac6191d0b3722c5af2354 -:009480d1d6a76d79b5c04053327723fbce068e -:0094902fea3bb4583afbac83b975810ff45759 -:0094a0bd404a57d49babfaaefc8e1183eeb487 -:0094b0795244fb1805622f6a69348b175fd5a4 -:0094c064c3968c15a57e31c852f2b27bf81400 -:0094d07a81dcfc1c3b984570a0c7ff7aa08fe3 -:0094e0853644a09d96114365ed04c3502bde04 -:0094f04fffd897ec3ebd6df4a28f03dffd04af -:00950056ed2d7d72f2a67e25014569b13b262d -:0095104f0b28ca93779b396509b2911523bed9 -:009520e0aba53e7c3fd7e94694f521a61fa841 -:00953014a1121d11c99e06ed3e9d54dd971780 -:00954009efba01736ae855c4c0be8c77b35550 -:0095501679828e42be7f75655f535f002a7b0a -:0095606f9f09918e557a2407dee7072b3fcc41 -:00957028599c5fce1e0aae5a1c886b5c41e7e6 -:00958094e753a0b7c0ea517ca419e7d7cb91f9 -:0095900280594476a0117bb81de747f980219c -:0095a077202e548a61b9f634c97f7c4de94d6c -:0095b052e9c05e14ad4e26280c44e8718f8027 -:0095c004ea5eb0e831df319ccfd52a2fd3bd83 -:0095d037286c6f62a3220ac8799e3755f1e98d -:0095e0555a75d4eab7762aa3ca31f18a1c182c -:0095f0df317e0818631fd97a206acd21f24c21 -:009600b598b8a8ce855f16a0f9c09c00243e7d -:009610b714b15495859157e78badd433d77926 -:009620226380378c06b8de9613779385d39f37 -:00963057afd276aa8782a404912c1fced0b0ff -:009640afefdd8bd8d6f4116bd937c6a8751847 -:0096500d3c107d74371af57b23bae1b70f1d4c -:0096604136b168211995470add20a2faaa33b4 -:00967051fdfd48196d2a6e2cd3f70c3703b009 -:0096809dbe7d0daf5c12361a3dfdfa3e2d5105 -:0096907cf5edb419565bfae023acd29e720906 -:0096a095a03d88b16136321f5adc29a47a2d23 -:0096b0eee822e48e25b60d7813b69880a37bbf -:0096c0067943fd15fe7b7f0ed570c17e6fe36b -:0096d0558fd9a20dbe070e6a92660d04956f1b -:0096e0f5e219f74fe02bc80127da5fef3db481 -:0096f00b835b30986de3677f7c8b7928d44537 -:0097008a594979dc3166949dc80920ff3afdc0 -:009710ed5cd4dc9da1e8dacb1feea45ba185b3 -:009720017b02fa1e2a316fa748b3cc9a2a4e40 -:009730c30cefb9f2a4e379217a4e09c019cbe1 -:009740f3a6840752dede2abb09e2270032cd0a -:0097504182d01a55180a1f49711885e26c7264 -:0097607568bf04a08daa8c31a677b71c636a13 -:0097707c767c308270c1873bc98dde33db6a3a -:009780bd760ddda08327e44ece76f02e18f7dc -:009790e6081b4a2636b38cef5c55afa6478cb5 -:0097a03c98a3c300babee0097007be5de495f6 -:0097b072e6595e7c7300d24fc956db069054d8 -:0097c017a3b06820a0b33a50a36bf0c88a6e9d -:0097d082d317ee312c95c154e208065496b73c -:0097e00826ca7eaad7ed6563165821bae0a71f -:0097f08734bc9360454275202cae2597f95c4d -:009800a081c2cd53e028aad48035b983e76ee8 -:009810cfc98b7946ebe4a2ab1571c53b9ccf39 -:009820a5052fd45c62e751b6c3dd9395291343 -:009830aabe52c5d3f8b0d251c6098aa4416b5e -:0098408ac76575a81ddb3875ce4ebbbd3d43c7 -:00985087406a9d1752485a1eeaf7022aed3af8 -:00986003bc81d94f452b9789faeed5aed8fd7d -:009870d9a7f43ee7e9b71454658b51e2a5232d -:00988015282bc2ca26b0589a1d7ae1fca188ed -:0098909571ba0379307f2c1d5edfcdc884a866 -:0098a0dab3cf0c4963065fc09e68b57eaef784 -:0098b0e04c599d9d7c7f0be5c7161d0c8cc672 -:0098c0e6bfc3d297ec26ba0a3ee64433529ba8 -:0098d0cd22ffd89db6a28ad40d8cde077226fb -:0098e0d20e965d4eb7f0f0e9c5c4d56c890bd7 -:0098f065c603ece2542e9fa4a3d69c5d0bd94a -:009900d7c96bac6a89e0ae0edc49f5a59a71f0 -:0099100152c8df05288bb63dfdcfe13e8c84a2 -:0099206bdca3a1c3f5c0a0d6eed35daae55503 -:00993058f0249cbea9827a06631f40e6f9948c -:0099403b04b9c6e3a2a24fac2c863f2ed7e874 -:0099503a46810157d27c126d982c6fd80935c0 -:0099601f4b61a93e37cacb22b267ff6d98f19b -:009970795a5a22d0af7e61893349ab99016929 -:009980b4b58713c9ff3d0f52611c646c098139 -:0099908d21a9b0190b6a6c5d144ea64ff2f8da -:0099a0e79ebc3688b60ae68f08819b4ed84632 -:0099b034d99d69946991864bfd257fa80e73da -:0099c0fd6ff9582d3927ec33e4416a99cced5a -:0099d0b97089f756910255c9bef533d69556e2 -:0099e0dd5ba0d2213d10699da9c27f472e3de5 -:0099f07f5e0b907175e981f07bfdf1247d9c4e -:009a005ecec0bce367a0b4bed61d9a2c2891e2 -:009a10d81e614424523315f29211b47791c2f5 -:009a208d14ddfd7b9378c3f30523fd114b0ced -:009a302c81b1d4644f56633887d83332d47d95 -:009a4007816474ee97165111d638d1b5290414 -:009a505fd92cadad1ed9a5137a9e94c459dd5a -:009a60d4864a08a8be81489df75fe796bd0deb -:009a700d4b08c31a4cf73c5b72c1afcaa02e66 -:009a80a1c05979262b7da78d00f21e28807f95 -:009a902448028d6d22217b8aff15f1922130c0 -:009aa0950c236283e6d1b2c93d7f51133572e3 -:009ab0a18546e8f1ed31e1daa0d4740b88ec60 -:009ac06317ca8e7221a9b757b512cf2e244517 -:009ad069289624d0c3cf7cd525a807c83eea2d -:009ae05b537b41399b464cd5241252aa83e86d -:009af0a3a3c6446aead92bb0aba18b989f62bb -:009b00ab503748cc5c874a36c3108c80e34bcc -:009b1009144b8f92de392663d68c024653915b -:009b20a2a360aa12a849e441c0273b537e4f27 -:009b30e561df20eaec2524abd3c9cf1f7ff179 -:009b40eec1b712d617064b99281f37ec7cb688 -:009b5078b3fdba4af8b4147eb7d6ac6e9ea331 -:009b6034a778416e2019ce00de3fa6841fecfd -:009b7048eaf99ed112dd9a0b667cc7cbb6c63b -:009b8004a757b61c059a0956c60609699e675d -:009b904272154cd38b2f8d7a607a64a781458e -:009ba0563c3edc7b66265e320c412d06f73af0 -:009bb0b1d98a9b3a426737c18d3f914a36bc0e -:009bc031d0362f3878eafe27e1ba091a4da4c0 -:009bd0cb4a530f6202a01488b42aef6ee1a4e4 -:009be0aac6dbeadc8b644a0ae88375a1cec8f3 -:009bf0ffa6b756e7d9d1c5f191517175683715 -:009c00c7de64753690e372f4e0eaa96a7d69ff -:009c10e687911b6989016df02b9608ff47c9a4 -:009c2093f49c840ddd3b023db98b4930614571 -:009c302df7c33b01c30f27166745a3d9a315ae -:009c4080a98a18a9b3cb88db5d2746589a14ad -:009c500dcab4b49d3800860f22c0a7bb9a5248 -:009c60e98f0a8182bc9d80ec5239143a3daf5e -:009c70ced736f005195e1490849f82f93716db -:009c807f89322c7888e02a5b9baf63778814fb -:009c90d80e97bd2b63bf3baeeb8de0beab580e -:009ca07546261c6978016de57f7fca5e8e8c80 -:009cb0c84a158cf886db81d0cc3dabb3a13729 -:009cc07bf9c699a2dda9672df60144014d411e -:009cd061e39f7e32331b4060ee39f5bd856232 -:009ce0fa2695476edd4119fc02ed74b8ed9175 -:009cf0298d6936a70e531cb0a3907362c4bc9c -:009d003e1fd9cc47d7857a116ccbf4e7ad66fa -:009d1053a2f8883662add9a65d829a642b7edf -:009d203eec0572febfe37eff6ccf823495baaa -:009d30b7a1532ee3686bfdb16d42f7b0884a1a -:009d401d537ec655ae12315c1c95dd7c087a97 -:009d505133510e11786715ddb0bef4624d64c8 -:009d60e004a8fb9311dc4c513f63d45ad1d91e -:009d7059dd086c203f8a2d85aa3be3b5489747 -:009d807598dbc033d7763f41ae2789d79754e1 -:009d905eeca0455725eeaa25a204c51e337cce -:009da0845797753ace279e01ee099b5a1aa5c3 -:009db0b6d40908ad9532707017446d6832a53e -:009dc023766661c6b021475b144e2aa5ff300c -:009dd0f12ad1bd3ad769780e88082ec9db6d5e -:009de0531d1db1ae2aa4629007af2fadbf4076 -:009df0f84ddbcd770c5581ee259b18e3784c6b -:009e0026572ea84556e023af7fff854b90b426 -:009e10bc5de28325e2fe1c2a4ca2812b16712e -:009e20d327187fdd4339b47e3b0b63b5fa1e51 -:009e30c45dd97540ec975eef70c68f9117a722 -:009e40feceb88ba3a4efd1e13ef52816e1de09 -:009e507fb812fefea72a4a3d61ceedad50af9b -:009e6085099810ea53ed01d0757ad08d869d87 -:009e70876bae87698d66e561e35ceac43c126c -:009e80418e93f0890c6edc546331bb4c2c676a -:009e90296adec85f960bbe84298afc4a10a4a4 -:009ea0d82d872c581ebd4f1b5c71e4c967156f -:009eb022b05675365bbb6c95d37cec09e48081 -:009ec0a7e192a6a8fc168d17be9541fc738b9b -:009ed0e1a4ec6bb7d6228afdc50104b7536da2 -:009ee0ef0f03f17c43a5cfcdddf5e0c9893daa -:009ef03e36c9e0511281a05b4707e7b7824a2c -:009f00ee32e275d1a923011654ee496944901c -:009f1034187833303e9ba1be351be32aabd32c -:009f20a804f71b0b7e85c193246aa8a70c3226 -:009f301b9a76608c706376817571eef444400e -:009f401671e76584822eabc22ba7e24687d7da -:009f50e9beb5c5f5a5795473f93e2f7895f145 -:009f600d3aa735e2325f37189277d06814cd8a -:009f7007e00a4c16ebd509ab2f1164e6aafe58 -:009f8023f777384bc25413c528060c118eb2dd -:009f90e296d65ee732cf396455bfa2a6f9277f -:009fa017b4cb92b5e0cfaaa7450afdb3117bb4 -:009fb0b47cf015fbee0c4277bb67e682e82ec2 -:009fc0a4df26750985ea61c63af490b3e5d7f4 -:009fd00031f7761a9d4238fe3c3e3b3747f5fd -:009fe01149fa859ce3eaac68e562f32e707f96 -:009ff03422c962a565216f7aae6ac694ae13a5 -:00a000a1ca44a3b003447738471a487a0788c4 -:00a010ef6cd9619b83031a5c04beda062d1075 -:00a020724a90b2aea351f32ad908b217438e11 -:00a0302941214e1af6e18417a067347cb2defb -:00a040b8d28724573806a2283e7302962d0541 -:00a0505b76cb4730d6741a676d0f738f8047fc -:00a0606f111692de61ee56cc454c136ce6319d -:00a070ea55199ff409cda8ba596b81613ccff4 -:00a0806237c87a488df940174dec2957352dc7 -:00a0901d5141dcec0e450af4864fede79b48e7 -:00a0a0ed392bde5c53cce88b6b5b19562c1f6b -:00a0b0e4f81981b249c562de67310fd6ea0946 -:00a0c02b42cb04ef4534123a0abf6ebdc92fd1 -:00a0d00ef73dbfc6cec3905ed4aa753b44eee2 -:00a0e08128d8f13ddac5b154b7132b7845e045 -:00a0f0aab25794b95f21c35ab4191be056ef45 -:00a100c6f55684fdd97fc6f3a9deccd607c1c5 -:00a110d3a1ac08c70ba762b77573d293f84dd9 -:00a120ead7090a9e8b7e2505f15dad084eccb5 -:00a130bc6a36ae1be8f9d1f08771c656856f83 -:00a140a656a45217603f089a375b7f3be6cf50 -:00a150394721545e8db0ce687b20da3ac1037c -:00a1605114c183f14ce56da875bf9244de758f -:00a170602180752f701ca7a70d0885fe782f94 -:00a180a45abc9dd94b95899036f63a661fdebf -:00a190b2b46ed2d9a11b91abe85052cc039e73 -:00a1a0d30de10d6c8b230a2eefd2f5783aae6e -:00a1b05f5b8ae85ec9c19c3900e84d7af8984b -:00a1c04bbcf9f88674a020483fb632517bcf7d -:00a1d0325d2ce6b1622ad4f64eb7d48c1aca48 -:00a1e07d1513c67891d3cec3a367bea9b503d2 -:00a1f020d79113592b2d782c69e4afa524a357 -:00a200218d067c2a82b077f150bb4305d81fae -:00a210503b2cc7264415fac70b99d3815b63c4 -:00a2201f59597d775cb03e16835ef3d8fa5454 -:00a230b4645f27240ae9797164bb52ebfc95fe -:00a240ddf044b05f13f13d0d8812a4359cdb81 -:00a250a43c65e77c1a0e1ce1d86bdb318defb1 -:00a260be39559b8702b6b87432c7ead3bfc0fe -:00a2709572dd3a6121b7730dc43dbdf836bcd8 -:00a28088c9662e43b4f1ee0ea0142d3923983f -:00a290c0ecd27ef6bfeab09d0bcda01c35c70e -:00a2a0556a52e180fbfe07b99209fb096149ac -:00a2b01b1ef0d8008a23542cd26f191f2ed69a -:00a2c0ad4ff0987f8b1ea4a1cebb32ef6d7be6 -:00a2d043849d9017687e0801c4f133a624f3b1 -:00a2e0b17a8e6ed8a8852ed89a9bec97fa9c27 -:00a2f0fb34cf87d0440cb350c1506ed97f3757 -:00a300627497437176ce60d3fb8695c9ff6019 -:00a310eeb00d801b70ff4c4d70d44dc05f902b -:00a320c246df8649e401b0fd4e396cd473ce57 -:00a3303879d3dffc8809dad4d1fc64a2a64f21 -:00a340436f0671d63fd133336349cc9840bf7f -:00a350d15148e00a8c21ec6d82e6790df4da6e -:00a36021346fb80dd7696c04ebaa68be322ff8 -:00a370770610e1aa6a9391bc2466d007192152 -:00a3802eee2ea2afa6ef158c97a363d0cac267 -:00a390f2c991016a53c766b8ac179a6c52e78b -:00a3a03a10ba8b2da0165e3050f3064872aa99 -:00a3b03b662d1dd6d27133360301c98e261c08 -:00a3c0c4b8603a89a1ffff8595a821c8f92e47 -:00a3d0970c319779b8468009e1496453b4bcc3 -:00a3e01b9cf671ebcbc027a284380d71a84ab7 -:00a3f0dd38062a9d32aa744253de916e7f16d4 -:00a4009efb0c62ec63c836dc2049787962bdc7 -:00a410f541455ce7c3a4a4590698200e6029f7 -:00a42035eb79b021aee4f1e826293e06ec0955 -:00a43043419c089cd7a836228ac825cc9b3920 -:00a440f919f0ff59655b0844b0b17b3a48a7d1 -:00a450d815885869f4fc16fbe784f7dfce3abb -:00a460d33e954b729d8f151ada73cb2ea57a61 -:00a470380b257d94ed12db6be98b2b10213870 -:00a4803d512e0fa43bcf332e97fe3b933c1c9b -:00a490aaee1772630d08ac06429122633af94b -:00a4a01eb56b8390c4fff965d6e4bfc1d0be70 -:00a4b0233efe5763da6a8a341b235b0185146b -:00a4c0b4f06e9a5b30ea645fd53c6d406ff6d1 -:00a4d0e53e72df299ad05f46e2e5e45813e7f6 -:00a4e0f44e0ccb0bc23ffd6ebdb778538f972a -:00a4f0ca42d576fc57f936cc09b259e6adba3a -:00a50033dc6f295e4e1fa38600e80460698bb4 -:00a510efbf8865440ee748309e46661523edfb -:00a520832a6f005f99157a7c0ead71ca034372 -:00a53082843fc42d7913efac259537e13a3673 -:00a54070fe470288fe4efa02e6d6cdd4d396d1 -:00a55039c8028a87a5e0c22a413df8c090092e -:00a56061ebc96b9b7f1becb503a34ff4e1eb65 -:00a570d960b9fcd836cc0b61a95f3f7ccaa75d -:00a58020936d61712fca2bafa4d9d4885bd59f -:00a590c513868afc0db0f72a55a1805d4f89ea -:00a5a05137b02da3b6f74bf198d1ed352e2e91 -:00a5b018090366adb94555ee7f60a9dfbbafbf -:00a5c0ab2e74fd1e2ca26eb366cbb62fc156ee -:00a5d02a151aa05044f7fe10c9b4d5e8e4c45d -:00a5e011a4d86db82b526a596da85449341f08 -:00a5f023ec4cba7fd3c3898c1a449c85d89662 -:00a60069e25c5e235ea868b2ae96eb88ae2cbf -:00a6109ab87c1eb316a79519dc88de6a18d45c -:00a620a9ffcfc155ee57139649b1cb9dbf63cd -:00a630bd5a2dc7623e239d8566689ca22662c5 -:00a640d0f87c923dab9b497c386a9925614a3d -:00a6508c89d42ecc2c25460786cb1e15a27a4e -:00a660736c147e08ad7f68980ab0b241e5047f -:00a6705d829930a120ea31a8b978733b7872fb -:00a680b0f217628bafa7c20e8231db80cd6442 -:00a690eea729b8fa41ed080893d5daa0d7bb0e -:00a6a037f54e92b42737d104fa47b0d258fc58 -:00a6b05a27bc3b17c600b99d9519f179e56670 -:00a6c0b24c1f22a0ae0f9ebed12eccef58d937 -:00a6d03d171732bae22827d4c46b59b6b8b93d -:00a6e02529af3b1a3a67ca68d6e05eed2fcf9c -:00a6f018d2a2ccef1f3d0d01e60d3131d16d02 -:00a700ebae8e9a84e59d1f18dbe4e21fa1cd69 -:00a710242ac8b43c5fa3bda7f77e4b244874f5 -:00a72021480a5cd0a2154992e1545657b6465f -:00a7303a5b35ef419b3283b75dc86a5d4a8619 -:00a7402459f13c73e80b453a8b0bdcada22580 -:00a750b0d4479e8039912ad8746be37882c7f3 -:00a7608f50eb30ef914f19722a29884a94c73f -:00a7705fa3d8d16ae2bac4bec987fee4dff907 -:00a780188289a4cc0fe973b3711a4da3d1fd23 -:00a7908c9057a3d78da4d1b97083737d597681 -:00a7a0ba728631957454997c00cbbeba2bd138 -:00a7b07045c75645e601e96baca46a426157b9 -:00a7c0e40c4735bb97e1939a24b8557c8bd69a -:00a7d02eee8ef2817d8a2e48d3b09d02fb06b0 -:00a7e02c43e54c8546354204f08e623bd5f41a -:00a7f0be186c4b362d7b9c251fc98aa4d9a566 -:00a800e062ab3578014f42f534ceb067416fcf -:00a8103e6752bf0af9cd1fabf0a7a2d271968a -:00a820198fe3976fe8f8a5d7abc50c0c7910da -:00a830ac8bd53d330ae77752200ff575040c20 -:00a840c6c35863ed12f4c40f5cd44c45746e78 -:00a850e533cea3eb6e752f780551889b6b767a -:00a860ff2dda1f4aa4400171aaceb781612b6d -:00a870967715df1d46327c6f205ca726e93a28 -:00a880f929d4caf659145759080e76ef8fcb41 -:00a890567602fa82c0bd0002ec63d19b1eff7e -:00a8a0d8831a652693991588dad65acaf7d242 -:00a8b0e42579db11f9b13a4d0ed916451e3af9 -:00a8c08b6b41299f1c9414bb9a819aff390988 -:00a8d0e91d36c6a2bc8b33a54190c2fdf4a264 -:00a8e03c997cb3d5102df1d8b79c76cd319b35 -:00a8f0653619074dc7970b42b6aa96967b8a0b -:00a9005f1fafd98f1eb64ffce798d86fcb158d -:00a910c1b7561653b86ab086cab8b0d1a7cb90 -:00a92001c3251766095c0362afe1c59924b395 -:00a93081a0c467d2471fcdc52d13f585d6d3ff -:00a9406204891638ed284fee84bf5459a2c7da -:00a95097580b67d8ffbd9719d500d8bc5cb124 -:00a960beb5c0e378b32983787ecd0d16c38644 -:00a9708cc667071925b67aeaec0b2fde7fc548 -:00a980f9860466e51f411dbcb80f7bc2f6e996 -:00a990c21236f65f9da52c9f79e6fd97e5f5f4 -:00a9a02293d27090005794068d522fe31b31c4 -:00a9b0a28fa2099a39dd9a7677ad9c93b28d1d -:00a9c05723f5fcb7873a26d4f720d4096d90cb -:00a9d0f67321cf26a644d3a71284a7d1435287 -:00a9e0b5be8aa665ff695575e930f644d11090 -:00a9f07778843e0acacbc3911d74b19005b9ab -:00aa00b791d0d3d16773c528e3a3bb7690b0b0 -:00aa10ecbe03da130cc7ea9e338114467f6b87 -:00aa204e5e3f10693012a6e4760da9f60c0e37 -:00aa30e4ca448ac5a43076503186a6a4ab982f -:00aa40e56219e2e572e1d7a4ec67d208378503 -:00aa50034986305422a3d7145b7cd56d39959a -:00aa608fd85087dce0cbfaecedd58c09652e56 -:00aa70f5d280129abd09e9cb1c6f2d330c9efe -:00aa80b28ea9126421fd0716b479c1f25d986f -:00aa907c0a7e89ee5846cad81e81d0d9b86e50 -:00aaa07b4a715ab3f27168c380e8af672388a4 -:00aab0c7947f81b8e9439538c360fb60a29a64 -:00aac055a8c488cfcf7868d73f7a1aadd6273c -:00aad09578c82494ccf726c47a834cb49e0efe -:00aae0a2e269f94f2d151ed0a97656e0171131 -:00aaf08067a0f89c55bc769e7132ead01e2c92 -:00ab007b1a3e1a57639564e496bfe2d4d59677 -:00ab108f8588b6e028ecd2e712401ce6db4bc5 -:00ab20bb006b6d4687d2926037af4e0e68563f -:00ab30c145f7aa621a0b65d59393345ff34f79 -:00ab404fd0fc1083c725680f46b0d5217d28d4 -:00ab507942b6c9e9d0bcd9e2b74ee1bd10c0a7 -:00ab60a8ed5f00321f747202c9e451b60d032f -:00ab700fda5763f7c5b4f301f02ffa40717988 -:00ab801294a2ad334da43781617d54ac73e95d -:00ab9042d039cf62b6bbd0802f8b9b386e5914 -:00aba08bde2bc2626ca51198f82e9ca82861e1 -:00abb043499c1d9816651b0891f78c1ee9c498 -:00abc0fb00f312940b9b2c28c77a5018d81a25 -:00abd071ff5ca4640d720a2a9c0bd222d8c9e8 -:00abe01e7c60fa1ded6bda6b902768eace2f9d -:00abf039913e7b6cce04e54087cece94daea88 -:00ac00db4d2971f2262e6f3623b6212c5866b3 -:00ac100bf77bc63778664b945451ea4b495ea0 -:00ac208152fe5a92b17d5b4c38217c25f56c91 -:00ac304471186d754293dabc00f4d3bb4437d3 -:00ac400dc85f6f0a74ff571230b1e75ce6e173 -:00ac50d7822a3a52fe5681cd2fd83f0578b052 -:00ac6050f1cf53f68733dcd314149b7f77f843 -:00ac70fc396053e91fa9f9028f4d2e2035a6a7 -:00ac80c6e83faa90e43a03ac26736fd050f4da -:00ac90dd9958cc06ca26fd00304da57dfd4617 -:00aca083892fdd596213aced33e256d976d784 -:00acb0d45cc6ddac532b076b4b78b997c79580 -:00acc0358c38347dfc45d814bd0791dd5a138c -:00acd05ccdc34e01744d4313a20075b6d25567 -:00ace0a2b6516a87f3305142ab4011a891518b -:00acf071a1a4859810ed0357070e8227de428f -:00ad008c994ff0543193a60ea2a879217391a5 -:00ad104baa4a7a88251cab7a98edf6ddace2fa -:00ad2055e940053899dac34bde38e9fa1646db -:00ad3024e247c06a2c6d5d7c00d2c744266c71 -:00ad4063e3f87cc1eb14fe4f584d550636d6e0 -:00ad5013c72caa8510f73a6933182d8bda58a2 -:00ad60e6e742018122ceb0c82f573eb39664e3 -:00ad70c8c40a721448c53308fea18ae4f6f7e9 -:00ad8060818cb027a8b6bdb1b185336bea3d1c -:00ad9076caf90b51654d73d42e8636814db7e3 -:00ada0800ed8a111b8a9a0d4c161efe56203d9 -:00adb05a10b5f32d89dab103f25be5e02674b1 -:00adc0ea571dd140e5c7a64f4e0eaf4fa60baa -:00add07a47bcd78e498c7e862a692c24a440f3 -:00ade0c194d254716f507a4cac0e4913f3f621 -:00adf0af4a659ea90f560712b17c50d5bcec24 -:00ae00e4e07d0cc3a4f8defa6e92a3b8df8249 -:00ae10095da81d480fd1851209ce01c08c74fc -:00ae20f2303b15ea6957f0b884bfdc22d87901 -:00ae306d131bfb14c4802dcb7961d00936574e -:00ae405ecde192e41e0b2b06773a67a3b65077 -:00ae50beee42119721c45377a243bb6e456178 -:00ae601107f87559d92aa063ce4aae83865963 -:00ae7078c8155d5f07a73ea09e2ce20741a434 -:00ae80e168cb984a4acd8aad235ada184d270f -:00ae907f5cacd47f385b8bd3a324433b1679fa -:00aea03d6c9e1b66f1e599ffa02bdc6b48b4b7 -:00aeb0cb197776730e062865bf125a13809b0f -:00aec0b234a923b420027fd2a28c05ccc23e4a -:00aed074c10ef2ac65ded39ced2d62ab590365 -:00aee07c805af143d6709adab865a5f9844b03 -:00aef0d5a28bd8b3995fb0b19e6a5bedf9d38e -:00af00e241e612a06da615e85ee519785e9a0f -:00af104bc2ac7f972c74d383be04827a18e4f4 -:00af205ed887f98875fb76388959e54adbe4b2 -:00af30ffb10464ff4c465f935f948eb5c32d04 -:00af40a84f964b31adcf7547f82d6492196ffe -:00af5036a7274bc0fd531d84375976a4b5f346 -:00af60e67911184119f39da7514b2a8590bb90 -:00af70ead015fcd6235b3b515ba5b3cd90a9ac -:00af80a910e3aede72b74a4bdf46cf51b11b83 -:00af90502d9f9ec642cf9bb1541484ec064447 -:00afa0b4e3d477b57b11b2d70982d430926c76 -:00afb01eb0aee836f8d7ad109b36599101d73d -:00afc068e94e301e1d0d9d64a4eaea4f142b5e -:00afd0ab3f722c3b80d341c14299e82f49481f -:00afe074a887ce776113461edc83124279d24a -:00aff0b4887324c082f7bdb95155ca2be43351 -:00b000da7d1f7e88d2d5aa79c6225bb487ff7b -:00b010d82f93c39e2021d1bc56cbcaffc5e922 -:00b020fec06a590c2187c968328ee1dd1f0d8d -:00b030f7ab7bd8621ccd0b5fee6e2d935e167e -:00b040188f645a82b955761fc36a125f725f2a -:00b050ae7b6e69ed4e8ff0a1644e69ab6e5762 -:00b0604b3281170eb5cabb2d0d86fc4f47f3d0 -:00b070954d9838fcc31914e207be070812d8f2 -:00b080d3f25b5446e13508a874c09e0c54214d -:00b0905c85ba80bcc8c8331b20b60cfeea922b -:00b0a090df002108c63796a4c6c714190e9819 -:00b0b0e48810044014f12c3b9912eac7f1d0a5 -:00b0c0607d026e8b3cd98330e74c89d3f16373 -:00b0d0247524b76a96e6843ccdf0caf015a8c8 -:00b0e039f99e732ceddc16ad99effb4193ed48 -:00b0f0d9fe7ff4dd67efe1ecd0bc3dfffa7559 -:00b100a812413d73ac4a8bf5d5e97517258c1c -:00b110e5fe5868d6d1e41b4087377fc2340118 -:00b1202db6f1b8f9532067623d1b58976d5e27 -:00b130ce166401c42d976877f049fd9d2a182a -:00b140ef05cacc125f06dba76d84175e58874a -:00b1500aada97a7ec2e876cfae568a956e39e7 -:00b16032ed68870ad9b5091dfc57d5888c44ca -:00b170ec508121fbebb70f7547011b8929945e -:00b180efa4b6d33bd9caa95d9b3804c5ec6586 -:00b190b5df951bf9382b58832b23112e763add -:00b1a01b122c5e195d27e44d7248d7fd6be059 -:00b1b06a4fc498a6a7b6c8813f6a7e7ad30ea9 -:00b1c09998bb1fa809e9ece1582c2c44d9d9dc -:00b1d0156c67d72fa1fe47d63bca7d8a4d6f5e -:00b1e03bc89c2647ab0fa3fda70827f2f1655b -:00b1f02b667cae90923dd824005b93f31798bb -:00b200337ad310598e7982eca16eac2eea0214 -:00b210eb2e03d8db974495a45fccea1588619e -:00b22094ebf0a243db0c116c280eb0903718cf -:00b2300504497667e6322cb22c4c350bbd6a00 -:00b240d7d8b83778db8ac162d9b6ba6ad1eba5 -:00b250322ba9b6e0d05d1deb2852bc117a7a69 -:00b260d7f72a02dc3a1232f32bf39b98017918 -:00b270dddb4204d73ffdc439407915723cb623 -:00b280331b00f5ebdbe943728b84fb4e7e4a4e -:00b2902f068e4158951bd5d1a759ea17e61d51 -:00b2a0534908337e9feb77d0327839cc2ac577 -:00b2b0334f96e3a3eea7347cd12e838ba9d38e -:00b2c043dbcb74cb8780f87660678de5036403 -:00b2d0397f7bbeb4b0a8397bd39fc4e1178529 -:00b2e090610e7257958e85642aea006083d325 -:00b2f02d27a3864070f4e3f22f9f1e5fc57e38 -:00b300f635189f91bdcf0961b079559b84987e -:00b310cb90f047a2d579520b13c6ab6df6dee6 -:00b3203c54aef281281fdcc078caaddf1a774a -:00b330aaa11a242769b4c724e0ed8a02a0c5aa -:00b340f717070f715a8e53a4b9bb31d6794736 -:00b3500f76e1fea16c19135d2276c40958fdf6 -:00b3609c5dde1da0338ff7eed260a13cdc2b71 -:00b37004e63f086058576befa2ec438d4d4bd8 -:00b380848fc2ce1974fd232fc5a8b4ed6e12d2 -:00b3908352355e96cf065b83a5dd1f7b0335a5 -:00b3a0354e22b3f67d37ee450bc7465d4b7c40 -:00b3b07f9a0122e8c85a622b77c5c59d51a314 -:00b3c095f9d8da2d8d680a09aca28494621a39 -:00b3d0823df1218050396dcb7406b22c711fed -:00b3e0750e0b8df4c5f86b319dcff92972a8d1 -:00b3f06d8b367ac56ebaeae9a198c438386653 -:00b4005e3b37de1fb0d6a46cf6e78f58977e90 -:00b410a1d2b44ad495eb1ac1a2bba6ab9d8f7f -:00b420bece58990638ee71669a6da6a7f2d82b -:00b430f76910438506ca8199015d6084481d64 -:00b440a273ae163f064c8348b4bdc9f42c8c7e -:00b4504a4b8f8ee1ade5aa47631010e8ccf9cf -:00b460245fd2ae5659b79386df348ef509fd95 -:00b47087572a1f1b3b9e1cfbc84804ff61477e -:00b480c410039a772bccd871e67da14756297e -:00b4905598760fd786d25b3a24159cec41a76b -:00b4a0aa901e21d8fb520278bc8d3f11828f7e -:00b4b02907e3b3146dcefccee56f4e910dae1c -:00b4c0143950b3e4207621e409c6312f548e2e -:00b4d06165b76333b918830adfb801f10316a5 -:00b4e086d5d1d4883675599dde308d71242123 -:00b4f0900739164db53dbb79f9ddf38a2663ac -:00b50085fc96c2cbdab51e4f3101bbcf39a54a -:00b5103fab3c3630b5dd44fd819996f1714460 -:00b5203d97b6d8a9d951f328dd64ee67b35b41 -:00b530df090c16ee27794390d3bb1ea4723252 -:00b54080a8b2719cc1dccbc94ebb73488f0c58 -:00b5506401f9572e7e162a0399338f18f6e93f -:00b56073ee52a5076fc819a8836f825244b807 -:00b5700f60fd23edc433d440c0de94a3ae5d72 -:00b580e755ddd6bd7874d8d65dbee0fc5aa36d -:00b590a09f1be29bd591d93c1a62e0eaa82ce2 -:00b5a09845f170e640d1b36b7fbecdc00c25b8 -:00b5b0c2b4532427c1ab244ac7ae9a81b5abfd -:00b5c05fc49e2b7debc7498a0b5d8a8b20eca4 -:00b5d0ae2a1839b3464dd83b7765347e30864c -:00b5e07cd97b5956847ef9f65ffc5e146aa88a -:00b5f0c32da6c7cb32207b6adb019b01f7a069 -:00b600433f823c6fdedb2722be25bd0110f7c2 -:00b610fa2a80e81c6fb002c24e4bffeb1f658e -:00b620151085681f986f0ac1499eafcea36a7b -:00b6300ba3e17bbf391f5cfab0fe0c1466e538 -:00b640582b359f43db53c166683cf63ba7775e -:00b650466a8a3c253d4dfed1ed028df33c5429 -:00b660873d5778b28d5802666bb4f597628208 -:00b6702a72f2791989fc8bc5e7732b06f9232b -:00b6802bb1377af1741a615042e89294107fb5 -:00b6903033a4c469beb0c9bca40bb9d0b58b0f -:00b6a0e7de2a26a9d7f924dadf4852be03433c -:00b6b0714b3020ff073dc290a523096f261e31 -:00b6c04fe5d8bec6eb2b3a68a9cabd96538466 -:00b6d0e3c218ceaa53aa8594c0af4610ff0691 -:00b6e00f32dafe56a1d34bbbf5fea237a513df -:00b6f0021083648c160629ce0ae53ea48d8e36 -:00b7003676e80b1d31b74f2623f6c642959c33 -:00b710a67709dcf1bed1c6264621fa616fe12b -:00b72060c8c8634de13a404a692c07988293da -:00b73022dec331fc4ed612fd8a0622735519bb -:00b7407dfbfac14f787d2c8add4b3a400af626 -:00b75097c6c23b1633ad3e77a26f1afe894d4d -:00b760a806a9ed4dc448c6f24e8f8fc0de601f -:00b7704663c7e6848a51f8b330bdc20c3a5c5d -:00b780bea1e84a13be993744e9b802063c86f5 -:00b7907ccf1c7e17958820a0cb9b2a4e27c948 -:00b7a0932a2c28358ec32b78d2973ebf198b3e -:00b7b03b4434b88e00403c9a932c4567b67500 -:00b7c08f29e95191eed722339f306c1aca8461 -:00b7d03ea64b33cdfbbc4e02beba3ddeaa8913 -:00b7e0151d1e701694f59ba9ebcd34f8aa55f4 -:00b7f007d970600ad18bf8675c1d25c4fb52de -:00b8004f5c25bc711d47a0b071c19ad7698fa3 -:00b8107a8085b92201d69c9d9d78ba8c579b4e -:00b820dbbfaf82af3854eb287ba98546062490 -:00b83082f368838cc6d6859191ff11ea5723da -:00b840827aa6651c562b2a76b88c69a51b312e -:00b850370b5bc00866fb550ec31ab61b83e687 -:00b86004fb98b94494e2f8cfe85ae2cbc99829 -:00b8704b79cbbc9352ce8ec7d9d32517d8885e -:00b88036a8284ccbc89d71ea10dc8189df185f -:00b890aeb668095a99f3103cb2d33fe0f45acd -:00b8a06467428e64d44655296a274f83c7f2e6 -:00b8b042319d6f7e365c32d1803017311bcab9 -:00b8c0d16c588585e5ec76690938ada1863113 -:00b8d01197c5493a4ed8713ce170f768d0ea95 -:00b8e00be82ea5dde85b07224ecf33d3dfa3b7 -:00b8f01d3ac3ab99149abc89a644468683ac9c -:00b9007c710c141c168d0a809ec68521f2c16a -:00b910f680f9ca89c4dcbb1d6f0bbc47d9f326 -:00b92079bd5b473f5e1ed015a299dab44f883a -:00b930408a536dd4cc70395330e74e345b12fd -:00b9400f9f8b8a61c07d9138ad6098c55023d9 -:00b950d5e74fe5d11c999eb9f10986e7bac9f1 -:00b9602d2a5c881f8df4decc4aedebb48cf2d1 -:00b97041eb7d9509e8fa6f34c8e48cc49f0e63 -:00b98083360c6a3ee611abd886ddec465d5909 -:00b990e5fbf7817e38d372c7ee53e5554ba138 -:00b9a0438d9e563aa82f6b2affef81d12960f8 -:00b9b08895c33309bcc184a6fdaa8a1ac72d77 -:00b9c055a3663b1a0cddaa7dfedbc989414222 -:00b9d0e0306cb9f6671d1c62dcd115073db416 -:00b9e0209e269f949ad19f2001c1b1915f7a19 -:00b9f0ab7f487d6d198af21a446e6056492299 -:00ba00b47f1608df6beb827ddfde8a874966bf -:00ba105a0255825f9b1a51f4b403d60dded621 -:00ba20946390aace53c63ebcf16fc871e09dc4 -:00ba30d61ebacc3e4d4c87920ac6cd38c0f93d -:00ba4056c87f0fc0119e75e685c3555c41ae44 -:00ba50469845d4306dcb2960afe2ec0ca5f7ac -:00ba60175a7568efd5f4f3ed23edca7c08780b -:00ba7096558238fa6a3e8ff1d3f1e2ecaccb98 -:00ba80d355e5aa340aded428a19c60a6bd48e2 -:00ba9052eac207feadb59699c45d87e4e5f064 -:00baa03efebe8eef28c51de02fe1ef7cd2fbc9 -:00bab09cbfc340cf3d3d34b24d112e5a4825b5 -:00bac03751b00081356eb2f022e12091f5334f -:00bad01e9e3d7a2625608ba7e451cc82e92a33 -:00bae06c0794a0df388dc96ffa98c9dff912ec -:00baf0e86af0c937b5baee34a62b2b76e51a45 -:00bb00e81c675223c44bb129a51f161391e795 -:00bb106eb6cf239be98fcf71be881c1c621aac -:00bb205807d3486aa648849b240b1ef6e1f0f8 -:00bb305d08928905650e69ee3e7dccc6e8823d -:00bb406cfefddd96c6679aaa504e543639c615 -:00bb50f90909bb86edf8dd841fcc3209ea5100 -:00bb604bbf57efca7e86cdcddff74c11ce2e9d -:00bb70e1eeef071fd9a578936d627b18e7c7d0 -:00bb80479e92c091396303445a167295e59062 -:00bb906cff278a18fad1a5bc69cfb9d7a55af2 -:00bba00b19ebead841990a002d37eb6314cf71 -:00bbb0c248236f3a43e3df3d71eae622064298 -:00bbc08f51fde91bad71f9f7f821b623b6ff70 -:00bbd0d8762bca12e60db08bdd5156cec53f02 -:00bbe02ea7b6511582560ec70e97b0cb1f564c -:00bbf02f9f932d2a1453955b66d95d6d02baae -:00bc00e3ca9adbeb6066fcde8709bbf7163692 -:00bc100c0ef463c667bf284e8fb96d8194788f -:00bc20112fd193803dd1f5176834ea2d9cd94b -:00bc304208ca28e691bb736eec8f82fbd82ff0 -:00bc40bcf1dd83a696e56597cf87b801f94775 -:00bc50fe79c316acd65b244ab09fcd406d2bed -:00bc6002e5421ac982b63d0aaeadba8fc4db0f -:00bc70991e75291d14cce38c93ec7f53ef81ba -:00bc80d44e523689fd8208668308077d89df28 -:00bc900e8856de15aee618c81eea4b3c0d19bf -:00bca0cbee4cd6535ea40b9a574efba3401a36 -:00bcb0b8ab61ff7d14e474fe84f34bb54553de -:00bcc0ad7cd205f9175f4f9c29291dbdec3395 -:00bcd00488a45d9b816948c7f1233cd9b5c364 -:00bce05b2a62679ab06f467f5f48b2176969dc -:00bcf0da79136616446f85f98366992ccd5e17 -:00bd00345aab41f19d60e2292d746e28ea1741 -:00bd10fc7a4eb91d175d113f04dd972192e533 -:00bd20448e775f97d93cdf6a889c823ee3fee9 -:00bd30b02d62b4c81606ebb01118773147a50a -:00bd4093b4419b83f8a9e8aa6c5241598d072f -:00bd50e489e6ca4ce21ab513fc091ac2c5afca -:00bd606ba3f811d5f14468aaf6b3b27dc5114a -:00bd70f3b05d62ec9a35903668b6619087e8e5 -:00bd803726806b7db0d307631361d42ccdef0c -:00bd90ff462179f12652be6372a1bded53aebb -:00bda0773c77ae35a0d7bfcb9c32fad0d36b0a -:00bdb0fdc491ffcfbbdbd044abcac6a2e72e9f -:00bdc01646d0307a32f5eaf9a31d9fd4bc7f5c -:00bdd0f685cf293d70d0bb76bc4163fee82258 -:00bde0954c05c2afb897ac77e928d6231540f3 -:00bdf09545216e9dbb2c2682bcc78cfd8e9ba6 -:00be000ef5fc08414ccdc57d967eea277d35ad -:00be101a9bd2588cc6ba5b0c3be4339d15ab97 -:00be203dcc91f6d562bd0473ade0bfd15ed9c3 -:00be306458c8611a172eb5bbb83ee09aaa80c2 -:00be402b2212012545a14b4c5b83d3de342df1 -:00be503475b5aabadcc54d5b8d4f08b8bd3b3f -:00be60c12eeaf97b5db2e5456531553061dc25 -:00be7019177f72cc38e8580e3d8e03cfaba501 -:00be80aee3a208abe8792d6375246d25a4e0e1 -:00be90197fb0c9c132c1d3534555e59a86de47 -:00bea0310122145faf67d312b26cf95dc84c25 -:00beb04d63f3d571a73340acec1b664f749970 -:00bec02d77b7cb92f96a504a5bd904fef4f66c -:00bed02fe23dd41da22e3cdd641031fbd35c3b -:00bee0103b39ed6879a627eb2f1b02b09b9b27 -:00bef06e5326411c1e4b68e47c1a3ecf55e47d -:00bf00f6a832709db748b90c82983a31f963b6 -:00bf106afb0c0e5243db91aa58b7bf40a7dd78 -:00bf2065a80a9999c7b4307c517055636b375e -:00bf30db6f4eca866cec4ec3145f9d3c8a25b4 -:00bf403f1c3f56e3d264a70c4311d688e70fe2 -:00bf501a6d180379ef57f952d6a8c89c1bfa99 -:00bf60007e2f0219d5bd3accd77b6afec31a87 -:00bf70144b49a49607ee71e72dcd8d26fac88c -:00bf8041bcc1bba1da5c17f44f71806094d0f0 -:00bf9030075e898e1f78144039aa87dc93ac43 -:00bfa0237d857418a55c5210cf01afd8e1df82 -:00bfb04d1b05f66f141c6f87fe58a58594e5e4 -:00bfc01bd13bcc71b0c94c118fba73440c9984 -:00bfd0462a51a0ed9b3511018e7086a9ef5658 -:00bfe014a6c4d113d25dfda5bb5b90558f5bf1 -:00bff03b7c836387251b59a7a5ed5a1b7e0361 -:00c000da40fcfbe846fc7103dc971b38eebcd9 -:00c01057d0dec27790393d83bee4fb60a6c4ce -:00c020a28c28e6be2791255afa2d9b0ac563e7 -:00c0303a8da7a37f595cfc28a0c6126260cd8d -:00c040ac7301568367bfd8c9daa37d249324dc -:00c0504f4d176dfe21b49023a3ce93a01d0392 -:00c060dcebead268b61fe8029e6003549dc53c -:00c07018325d883b12933c2ffb077c3a258762 -:00c080dc8607fdaaeb6ec9da0a60fe3599b9b5 -:00c0906592547ed48a53e2c3d0ae8ead00e077 -:00c0a00480ab4ff7a8f506dfb7480cefb605bc -:00c0b00ec5e975bbf170b9c69c04026b86e4f2 -:00c0c06d44c0e2255bb440721e53e1cffce32a -:00c0d06521b666f2cf25f1df939bbd5089cd01 -:00c0e0282c8f91d21479c1ca36e7b124b0e0c9 -:00c0f0321a3b8445f7ef32aceef053f80ccd51 -:00c1000ae41401ccfb84faa900db2b30c6606b -:00c1100f460ed8d340ddcea03e84d435edcfa0 -:00c1205d91020aea9efc105be7f888ba6ba5ea -:00c130ce271c37e96705b85bbbdd7d031deb8e -:00c140a2141e9fe65d7f15462bd69dc9d4ecb9 -:00c1500346531b9bea85afd7a581cbab3d5220 -:00c1606ccae5bd8311bc851edb62f9f589860d -:00c170a8fa51a6dfef07e5b6da5e4a4a316bb5 -:00c180eb7a009742714d2a47286c5091c6ee93 -:00c190742c3a3030c1f39f739fe0e735a8bfdb -:00c1a0210b4e98295d220d108009ca41c8077a -:00c1b0a6cb8c60aa41c39eaadb2e6134d74ac6 -:00c1c0c8f11cda4f6c090aa24a4a496dbe574c -:00c1d0efc971169d81236c697ea9d14d1db5db -:00c1e0d0b1ca1b31b5696103f9410c4c05ae07 -:00c1f03844cee9d8fc7084fd0a3a4ec18d749b -:00c2004dddeed9a5c1120427de69e68a9cc777 -:00c210f961b7a472036fb1580bb5215b7ef47f -:00c2201d23611aed4c243e13ddf3d4e0ca906b -:00c2305e489ba8db7924bc03a24eb2c9f92fba -:00c240a2ff27fdb5d057f16afbc357bced6a55 -:00c2509301024dae5aab403544475dc35f84f0 -:00c260241aa6d7a4ded88e304c02c97ef025fe -:00c270c56729faa4b1644309a7144effa1078b -:00c280d6cb3c974ae426c21efd41d720d8fedb -:00c290c0c7d5143f91d2a86dfe46fea603f1ac -:00c2a07d85f8f9575c7541c3781a57ef71a4e8 -:00c2b0ecf73e5c5f430e636617a65d62678f9a -:00c2c03ddc63f35803b62f976b193d13476872 -:00c2d05914e3c15104cd01fa012f02b1394697 -:00c2e00f78e00eede264f967510f8dcde1526d -:00c2f0e90411929056be1c7195e187338eef0a -:00c300ef0496ad118f211915fed8d31b5916c0 -:00c31045c5efcbb4519f1f73a05537c7555229 -:00c320d2041f8e61b8a3894d1c9cc542bb169f -:00c330ed267bfbc87cbe73339b0b3d2b0cdaa6 -:00c34044b3d5cbf9ca6f0e974ca29b93573fa1 -:00c350c24ba2d7ec9be0686c60e8ab754a3d4a -:00c360c48b37ba3be77b392cc321ead076d76d -:00c3704a45afcfbf7dc9cd4fb2bc278d24e1d3 -:00c3804ecc01548d3deb7d58429509d2d6f2f9 -:00c390652080cc31c64458e15b51a37fdf64e7 -:00c3a08921fee7b65cd8533e15d8ecbaaae9d2 -:00c3b00de2f8c6f833a44cf9080530fb3ba6b4 -:00c3c0f17d55a239527512687087cb62bedeb0 -:00c3d0f988547b99bab8ee35447780d183a7ac -:00c3e080802cf0705239813f9cc2d0325feb3e -:00c3f0b96c328c6f60ee558e5052ac04a53457 -:00c400df7b59d23e3ebc1594e94fe1a4f9cb90 -:00c4103bf2af9679e8e25715d56ea0ea707823 -:00c420f1ec54cd263087d4524575e0101be59f -:00c43072e49e183e325af166cdc964cfca11bd -:00c440967e55cf094de4a34131bd673b96305e -:00c45004b6ef2663cb14a5cf4d6c569015d66e -:00c4600e7e93896d71a81565f30058d9552d94 -:00c470dcb900802aaab786b7643b2c8268c55d -:00c48004ce75f31ce1822be279d6d7ba9a92b3 -:00c490d866d8b6a9aa52c19b902ee3876f1f88 -:00c4a0975b1b6c0406e4884375a70c5f0f6771 -:00c4b0306556a76b8b6430a9ef2a645e260e8f -:00c4c02696cc5237d4146bbf12e5925c0a404a -:00c4d07d7f1c1e5fcbc33b599f3061e358771b -:00c4e03f1f26af4f3d071ed97160cbf2cd6212 -:00c4f0ca0add37b102d5df85ba03f757e5e3bb -:00c50024b52e0e07ac70cab9fd9617e856db8f -:00c51049e12ab5596c286214fd4ea60a6444bd -:00c520af5167bc3b142518bde944c5d36c9545 -:00c5308257637547bbca3b1a285192142b1b56 -:00c54081c36bb5a0861fbad056e3b9a4307a5a -:00c5508f4d14f963e8ade4da18af89cdd102c8 -:00c5601db1a142a167fbf66c1d441ab0fc3f43 -:00c57026af960b7574e8862829e80701d3e694 -:00c5800d12ea7ec28649accf371f11a5f50f82 -:00c590ed41754fe6bf73b0e5e036e15402efb3 -:00c5a098678901fcdfaed903fcee5998441d61 -:00c5b015a599b94e6cba0aa7fbab72ca883929 -:00c5c0e5964be82501709144213470d38b25fc -:00c5d047900bec1a3cdbe60a0b3f524f60b042 -:00c5e0b6370799f86b383612df252faaa303e2 -:00c5f002a8f30a4e56ba88e21081e5a821c448 -:00c600791ee0d42e5a77f8655d35f2fc0539ee -:00c61018274f65fe77e0ef364e9b4289a35eac -:00c6202a51385b061c849c4bd48a9572e2dc53 -:00c63005943a52a95a4a8a69cf3ad9fee6c1a3 -:00c6408b688240096f4cc502f77f4310d4bdf9 -:00c65050c2de0544707fd6b24e7f43545ae34d -:00c6607a91d1d9e5fbabd532f187708820f325 -:00c67073c4b91acbe32a4297b4d3044abd14d4 -:00c680a2a4c8a8744376c43057d5472dea0d3a -:00c6903122a907432008acfc38f2a54cecb3a9 -:00c6a0ffec805b6782d1881a95dca58bd16604 -:00c6b09b7c10e58bb009ff952d82ba55ec4cc6 -:00c6c0dafabef2cae0bc9d6f3f5272e295bb73 -:00c6d064ab9768e3b87e3b75a592b441efba44 -:00c6e097c6a8607dca9d77906154e90e5e0340 -:00c6f0d726211e679f5ff6829286bc66c88e44 -:00c7008b32de3c8a2d9b4e3ae27b9aacd52e61 -:00c710ad27183e8ac04d49ddc1d0eb78ed6bbc -:00c7203fbf94af32883a6411f21f73719d9d25 -:00c7301c3250ba08be82b3e240c8dbe6a445af -:00c740ea28ff48698dcbdff8516d33a406406e -:00c7508f352d57fada2b75371d0792b578082a -:00c7603ff942eccb9b274df26825e174357406 -:00c770714b905c82b01a646f6ac0862bf4b761 -:00c7804281cbbc75de48226a7e48c737cd0676 -:00c7909199f1a7464aaecca5fdea597cd4395e -:00c7a0a742df5434eb58b87196989b1156b9ca -:00c7b0739d4e4301cc5186e9ef78da498aa5a1 -:00c7c09a407cb94b6e26a41c93a75e69a3c2f7 -:00c7d003bb343fef5e1f011f6b8fd665665656 -:00c7e0c94d0e9868254b83960f35f0df36bacd -:00c7f054717ac733c8271578683c661444fee9 -:00c800ee049450db19405a9c39020a12ef7de3 -:00c8101e339bb0147ecf4eb822e7f04d61bef7 -:00c8203862a0dc36773458b5632769c7033fce -:00c8307a7451154f2e4f7cfa29ef7ceefe5d56 -:00c840396f083557a880823ebe856976b6917f -:00c850f556a56999d7a73eafd2a65ba86235f4 -:00c8602595cd990b2b3708e873d6fe6825eb42 -:00c8701c2dec13ddbc2763327eef885eb63f1b -:00c88098d35382aabdf253f20de7ef23e76089 -:00c890b324e8cd9bee783aa2ff2175cda2b170 -:00c8a0779ce451a57a6e972633e171cdaa6a9e -:00c8b056b8f53d8bebb19e0483274517583b13 -:00c8c09e67f1af3e78da4fb7b3d8d65d23338f -:00c8d0d21864af40532e377bfd2ebde11a7e98 -:00c8e05bc6f692b44dddd6d91ab3504078d408 -:00c8f07e14b44fa08346371dd2266181fa281c -:00c900aeb4922a0f14bd872949e040d15396c1 -:00c9108686234524e20c4e9d9e377866d2fb85 -:00c92070d9d9387745b06a6bce4e4573d089ca -:00c9302d53c96defa5520e724e0dbd887b7bf5 -:00c94078468dc274dbcabb0d2fd666debb0a0c -:00c950e0b17379a7c92ea7c0305cbd4957e715 -:00c960f6c29b28fa415aa45fdabd56adba7521 -:00c970dd96b67b312c50a79f382cee3538a9ac -:00c9800f2a5b2046fbe3d2a176c9b601bed2c4 -:00c99086f6a87522b8fe64006ed23845cf4fcc -:00c9a0db59252e14d9bee82e7e6a9582ff498f -:00c9b0f684f5e0f59e0b0353b2df84f37450d3 -:00c9c0b3faf023c7e97ffb6016d4a7038b0281 -:00c9d0f29c3f893626fb627084582041858380 -:00c9e0495a1d9d6f1608bd705e9d3f5cde2977 -:00c9f07abdc5e65a716313b6cc50443bbff84c -:00ca0050073d40f17f781ba4732b925f2792c0 -:00ca10bd56f04ab01fbc8d945155cb8976ae28 -:00ca208b8dc811fba418bb93e26dd31d07b0d8 -:00ca30cdbc32078a6219d47335e0cdcd826168 -:00ca403efe01be07e45fd0ed66396b308ebee4 -:00ca50959959f2c6cc069c754c95f51b8969f0 -:00ca60bdbee924485c9f7b7961a2984028224b -:00ca700ff9703a565bf0a21d814866f39dc605 -:00ca803bf9a77de7dd22be6e9eab438c2ae739 -:00ca906a97f5f3f21a46e8a15847676d2e6515 -:00caa07795074051ff8694deb3959fa77dcd62 -:00cab0d4993c15b30ac983a3d8ec303bd7eab1 -:00cac0ed310d83bef47f9f6180b22ccd8bc43d -:00cad05b4105114eab7c14ee4a986e83954956 -:00cae0da69a36949987b4ebc87f941484c6ba1 -:00caf0c82e97acd5ab765a23ba265e6cb1a7ff -:00cb00cc9fe6980b36b1f10aea6b08a672cd95 -:00cb10345e7ed193a48ef8878e6f3524c1d847 -:00cb209217423d557a09aa94af62fdd8e10f7d -:00cb30ce1acfe096f29f5ffc74c2168fb11ca0 -:00cb4010b49a52765290f1fdd455eaaa38aa27 -:00cb50a44d48e66298dafa8e3cd479126fa099 -:00cb60f7f8d69b3df1930c4d7b53aa80a280ec -:00cb70792845515b92eb67aae183687e6ca5ed -:00cb80d901fcaf95f2d4105a3f114910123dd5 -:00cb906efa90e03271e1cf7c5f0b6b1c763f32 -:00cba07e59ed7190f572e33ecc65e91f9a28da -:00cbb08a7359505ebc5f2bbff94dc6d68df46c -:00cbc0213a69010d24d728ae38725842c21621 -:00cbd0ec1fe4fe4745a2a92ac5d0144cac0c4b -:00cbe01f0254f8f860ccb19a959673d2b85ba4 -:00cbf03740676b2370c7cb605fc1e0e7f33aaf -:00cc00eba18ac55c28b04114ccfe9fab17467e -:00cc10ea2d1912ab8e66f27e6c69c08dc49368 -:00cc2035142cff1eac1318c67e1dd70ff02591 -:00cc30ee298d8a402f317b0b2671cf4ca08265 -:00cc404157ae238de11d7c39635c3fc15b3b0e -:00cc50ef9a0d3495ca6c73111a77e68680ec1a -:00cc600b1c29fa51e0fbd0385336443cf2f04b -:00cc705802a7e88eb10861af2753b185ccf749 -:00cc80fa69fb1734cf4ff734d1cc6f2dcc1180 -:00cc9025555b3c77aecee9615d69c8fa03ff35 -:00cca008add9d92e54a6c229346c8283ac9bbf -:00ccb0b0808d6d7e304c021748eeb7d2b2429d -:00ccc0877c8e5b14db7a90eb48829d2a038305 -:00ccd0056b9d6dd807e7a359803d481f54887e -:00cce08cf140053cd14a542d88f2eaa0ce9e93 -:00ccf0dd924f3c665df6d6bb419fe2d80faee6 -:00cd00d8e31ef60ac9db54387d7d7edfebb5de -:00cd105e9aa54dc96140576a31114893a386fc -:00cd20d4ab0984d0f82f3e1a2884a53ac55eeb -:00cd309574943927510fced54be8646188295e -:00cd40095f1dd0829550603b080db1a307f6ed -:00cd50ef2b361c56d557e87794cc7b5d2c7173 -:00cd601d8a2d76c01a8f623cee85c05d721878 -:00cd70091a0e2ff56fa37c2255805ca89c4908 -:00cd80dcf1108a223b288804b341cfc5222cff -:00cd90c9a1a2a543e2ab7fbd014de0707031b6 -:00cda0bb28d7517fec986abd9b41264682efdf -:00cdb0f43731558a696d3de808292df9775027 -:00cdc0069cd2f3b18ac1654baff1d5b4b86e08 -:00cdd0820f71a1bcbeed077a8d93bc32a98e63 -:00cde005024244f675f287934a322effc41cfc -:00cdf0269bcd7cb0b18c9afaf3bf897bebf8e7 -:00ce008ef8d2f8b9b725164c1c3a6d1fc28696 -:00ce103e39a34f4fd3ac4a01420b1aabaf3f95 -:00ce20f977fda0c8e40085b625c018e218660b -:00ce3025c573542f661db61f8a680fbe96b016 -:00ce40e2c73b05b59eaf1e2e2369d3aa74d3f5 -:00ce50a83e9560c683af7a87942c5acceb05b1 -:00ce60f6f439f4f6f83e6da837c223ec60af1b -:00ce7076a1403c8edb9df47304367b4fac9ed7 -:00ce8009cd4c237d54c7f083aeeb75a884bba5 -:00ce908562df1757462e6d5e3c61235b7466b0 -:00cea005fa41691acede45b786261d78ac8406 -:00ceb0ae1a3b3a213133d471db263ffca29880 -:00cec057492e71c0c917fe7a7c7de16e9a93bf -:00ced0366400670d7048b951cec673ed6446e0 -:00cee036cb0fcab75d077f0e6476a4b7a4f9bc -:00cef0c0f2d4404c2ea8f56ad8bf432547678f -:00cf007f48cad0e937342768b543b71c3ec88a -:00cf10b30cba780f9f26e078298f70da091f70 -:00cf2046f5e78c33aae7adcbf06079e8c4781f -:00cf3039dbe89a42fc734aba2b2acfd169c3dd -:00cf40304f2a3ae30e3045290119489edcff1e -:00cf502cadfe8a307e86b202734df0b75155d3 -:00cf600e609523cdc970151afb21d59b068abd -:00cf70987936f7643500972584086df310e5fb -:00cf80bfdb82a7ef37cdb64e60e00e21cc0833 -:00cf9084d40e922ab44868d94fe521d809b678 -:00cfa0a616b91f903085d075dd944f24fb5cdd -:00cfb0ccbda5234921f70b115ced2e166fa769 -:00cfc02a9d295c971cacd87bf603136702cfb5 -:00cfd000bfda5ec58ad9f80a3c92a7f6274bec -:00cfe0d393423b5249c958aa36bba3bb6095b4 -:00cff06ed2aba91773056c9151a5451c08306e -:00d000ab8b98598ae2bd2bf7c28ec79b9767d7 -:00d0103251db646eda92fe01bf0dadc531a1b3 -:00d020a1af8d8e089210b58eab8a28d61d05bf -:00d03021b6051c146876e91f055d1a006b8425 -:00d0403c3b2c45c137561d5983da6555dd80bd -:00d0509d8b5b42ac501c7a4930967b7298efd6 -:00d0600c77ef5fae5a825e0ebf62f7206fd7f6 -:00d0702f738b2c6bb365d39ef36e7d7117a175 -:00d08017a704e4ed7fa90112629ee2b047826f -:00d090ff2d2b590c5f8b84560eea37728fc228 -:00d0a05980b76600a8cd162d51aa7ca087a49c -:00d0b0eb49df8cb15555148090e5be58962390 -:00d0c0d3d62c8860241ba1d25144a2349b7a7e -:00d0d0f610559b1000d70cf12bcc776a8d6989 -:00d0e043ef986d2f3c508eac0ce605bfc82d44 -:00d0f05aaea75e1a30aa97f43532917f9539c1 -:00d100b0227ee7f1e0d57c1be8911c98a04dce -:00d11071a09bb78e7ccf474fb472dffdd7e15c -:00d1203003655faf952268194e871e17f952e8 -:00d13019eb5f79d93d21f3ff5cda85a095cbae -:00d140c8e809cafa23545118f61d8f67d7588b -:00d150a77221fd3f77e242ce3fd4b856f4ce1e -:00d160264f2ab65a9ed44bd1961a6b5c1a5bfc -:00d170cb827313b7a76204078a946590df4ae7 -:00d180dd289635df771a5dc9cfbce34fac7283 -:00d190eeaed94133e8818381d85ae346f19d3c -:00d1a0d2923b831b0b7048fe72a398b4f01e45 -:00d1b0d1bb7c1516592d6738944f86ad45e28e -:00d1c0a41e093ba1160b6a1b065d210d4c946b -:00d1d03a31e3fa4fe04c4d2acfabf858ff5f50 -:00d1e04af8a4ec27575230b72d02c3dd77faf5 -:00d1f0d19877c042e304aa56b82e4a97fdcb88 -:00d200704aa1f83921f2afe5f50ecbf64b1599 -:00d21048aab36864c4ebc12428fb8b69620bbe -:00d2202924f84cd85ecef4950c8bab3a9feb9a -:00d2304ecc2369a7e1a3441b4a04836e2a4a2d -:00d2409a0f04adcaa7c322933581248d23c033 -:00d250bb2d27db33beb02b6bfc43d989833fbd -:00d260d81b0ee6ecf78713d55bf02b91653c58 -:00d270f3757eac8a98e06c94680069232afb14 -:00d28046425efdde8f0484699d54b13183809d -:00d290fe278abc0773fb18aeeecd79a0b82fbe -:00d2a0c0115729aa22b81e03b0cd1f47f90644 -:00d2b0b8f12e4031939b58ec2f61d51ace7f9e -:00d2c0669e596b3ab1b2b10391a08cb2ac3286 -:00d2d089c5d58b9769595578e78abcc40acc99 -:00d2e02ed34696cbd32c1397e86dee4f3182d2 -:00d2f096fbebc3aec8808d8e2b51be4718abfe -:00d300ee3768775cd3fb1450afa71fddb16992 -:00d310853ec16b09970d12c10a318942a02924 -:00d32060556255d8872e28b41723847ecece97 -:00d330c9fa017c0e9204167e8a1f466d13fb22 -:00d340351dcb5064a1b9c8d816b97daa02f324 -:00d350638f0280679f9f76052b3b72b2850031 -:00d3602dcd4f5b50ac97a20af8f7f07ef597df -:00d370a41a2a0cbdefd43a5f2766517281201e -:00d380d27c793daa087f5b6a5db1fa25e1dc8c -:00d390f6e796a6b80a194ded7880fc064f3de2 -:00d3a053f0cf910c8aed67e54c2cefc9a6e573 -:00d3b0077a441d24ad8e56e1610a4cb3297109 -:00d3c02a20f23b8a7a2e91f957ff9fcb1553c4 -:00d3d056650c1d626db291e6ae269439bc5a61 -:00d3e0f43ce12b880596170bf5ea0c70225889 -:00d3f02221cc07629f9a03adf8f633f3b0a284 -:00d4005e57d2b4a1de137ccce0ba871e846145 -:00d4107c2bde7e4ae6ef9d60e05b8b3e92f7e5 -:00d42012e5b5ff052b68179a80f78fa710ced3 -:00d4307092ecdc42e33e45596e98b61abe3a3c -:00d44011c1bae08a3d40b472cf4a46e291f750 -:00d450d3d25dfc5851da88e2cc55fb1c28d274 -:00d46062b3f6503fcd5ae1171a5b59c88da498 -:00d4702d548f7f2c0bbd60f0365f011eade1ed -:00d48022f98e96c7b966250778ed7426032920 -:00d4908146e88d1feccc237b9db5f12372222f -:00d4a00490fc71d6d2e8554f7c5b5ebdb359f6 -:00d4b0b8447c251ba8a99e1ec85050242f9dec -:00d4c015353cb45ca188fc46c9e37166cc0a8d -:00d4d0aa49052639be0b3b14203b7a69468c00 -:00d4e0ab496f30d4bee77a71a676eb45fcce04 -:00d4f0dd68884773cc42bfe2f984498eee15e2 -:00d500ffdfde4eaa9b209902a07a88104bc117 -:00d5109630dfc35ffd26f23c9f2a80a8146edb -:00d52023317da94df747e8c60824b706a4346b -:00d5304b5bccff673cbf43710eebe7522dae9b -:00d5404e64bf65f1fa9c5b82453e3160080a19 -:00d55076649d3c37403f2d6504c30e0e89d646 -:00d560d21f9e207c561941108069694e52a4e8 -:00d570466a329c9b3541322ec642ff2a1f093a -:00d58004a8eb81fd0b85d0eb2b9234a14ddf3e -:00d59019eedc964fa72bc5660485f0586e4195 -:00d5a04b011e8933a4993b46df8c773590588f -:00d5b0673c97af537bff143ebe00c70d500796 -:00d5c09947987af22bc2cc92f15d148b49e079 -:00d5d01edbaabd7473163adcc9f884ab53e2f8 -:00d5e02fa5b6b49b2acfdbc99cf78966785933 -:00d5f025de0da5455e1c0428914b9efb55ff1c -:00d6006090e07d019266fe1f197de4f51e99d0 -:00d610a5c0e1126237620a204014c68302c738 -:00d620e93a2dcd227f01c8badde5fe1c3143e5 -:00d630f4d0f1e6d6bc7d8f068bc22c6935d81b -:00d640a6959ee166dbc59efe55d25f3234d36d -:00d650ee1d51f6fe7db42092a1b7bddce4e0cc -:00d6600e3d2b9a88f24ad750ed4e4f917aa7df -:00d670bd8f2d7f54b6c91f2621bdb36320c9d8 -:00d680a07af6c69af46b82050f9577d362edb0 -:00d690c9232a020be15900d44a5ed7d7fdfe94 -:00d6a061dbeef34548ec8fae65b29b79f09690 -:00d6b09c555253345b833fe0c87179cee5865d -:00d6c0599b9473c53248114fbcadc9e994bde6 -:00d6d0e4b9deceef57fd73782dd78215ae2613 -:00d6e00efba8d7ea41b6e3d209c472ac4a2a7f -:00d6f05594fcd83d84b468dedf78f17aeffc36 -:00d700fa8c2718231bfd24240a3074e2d42937 -:00d710f47e6c3426eb46b6b7c48a8361f16c88 -:00d7209da2dd5a0eb7e9bc90e9ab228dd6ef89 -:00d730305f17b9b13f0d830ae15cbab69b5a3e -:00d740e9f142ee083f1a9bc549a1f79bca8798 -:00d750924738fd66ee30721182a1a8401bf6b7 -:00d760ecaa714685c8d198adc22642dd777688 -:00d77097053bc0c4b54fceb03df8a43acaed91 -:00d780bf7850d030e44c02afea9a470b72a1ea -:00d790b1d4e67745abe86c5e0e197bc6561cf5 -:00d7a00232a933c9cd221d24b70cbedb193217 -:00d7b00966b6ce55fdf24bc93567bc06f68483 -:00d7c0e1aad3f8b1aff1fb4663e64aee5645da -:00d7d07fe32147ef51ad936403956dc5398d17 -:00d7e0e1d2588692dca88d540c04cace08226c -:00d7f0b37785d421606b0594e5bbde46010ff4 -:00d800c9a9c8a3c72965137c3710f2fd3bdec3 -:00d81027c4f823477ddd7a082492bcbac3a63c -:00d820b82a1dd7dc41578ed64fb671fc4ebf85 -:00d8307d89b1fdc0af1257a2fada76789ea218 -:00d8407dbb14083cfdbba8b96edc09dea1da11 -:00d8502facac3d04009b3c2b2e176ccc65c2f5 -:00d860520115c855fe0ac868d80edd0313efbb -:00d870ff0aabe38a941525eee52f837fb7ba48 -:00d880adbdfcb67ba5ed630fcea0f9fceb90f5 -:00d890a5d7aab22fe591a9b15b156b504f5449 -:00d8a0ab7e09fe08087dc380ca6cbc4e3dfcd9 -:00d8b022aefb3da67a97e6d22d04393801b60a -:00d8c0188fb7cce18d74509cbf6ba8570d51bc -:00d8d05bbb4df01a903784b69045f41659d60a -:00d8e085144652757457b619e02b9fb7979a05 -:00d8f0e0999870fe4bacad5c5886ad317c6c51 -:00d9000aa0abb387588ed8405ff342d02c424b -:00d9103c40c95d7eb2de980a172a1ab6ff82d1 -:00d92088d1d28a15b1be1b1b1a3c95e13c7baa -:00d93024d022ab7f38fbe4664b5e90726dddbb -:00d940a572327212af3782c07e1e231e3283e4 -:00d950db1cb3a27614621c523bd2d128c0fc84 -:00d960dea07707b8944e29f20b2e9aba3c81f4 -:00d970a9b4386db3343deded2e33655f978401 -:00d98012e10cbfac7dfd7fcbbef91151a28a4c -:00d990f0869c52fa757c4f36d7d5316611d280 -:00d9a0c7b484b7bf5a4f1b9a6e5a074978abaa -:00d9b066713883a7d7a6cc59e452112b648288 -:00d9c0592ea216e8a9d67503a63e2ed4be5167 -:00d9d066e233bccefec582fa11631285dca030 -:00d9e066f46fb2178f4faa3235e4b6f98ee196 -:00d9f0e1828e33586493fdcc028b8f60da0cf9 -:00da00a441d114ee07763c48a8dec111d6c442 -:00da107bb87824bb66cd7d4f7c6c7fad99eeb5 -:00da20eaede12c57893e23b8da4a2ac42b1436 -:00da30fdcc588838dc0be07a80503687836f5b -:00da408c858c457dcdfa16591c28d0176a2904 -:00da50bbe0aaaaa31b721e03cfa466af7e1474 -:00da6047f84c5e2fa5659628500af8e664088c -:00da70fece5ede0e0a1e5b730cecbae969347e -:00da80fe07ae68aae35919a9f3876fa7c96a2b -:00da902aa5537372c8670d43fa0deb8759734b -:00daa0ac637d55a2bdedf951b578b6594116b8 -:00dab0437995a16edaec58f027166b7b14602f -:00dac0101fc22f817eedc461493bcaf344ba3c -:00dad0992d72c61b688fa20f26aca7746866f1 -:00dae0918c80d0442f35a6d66dfca254167c9d -:00daf06abcee1c01e0fbedc8bf4a22031a2c6b -:00db00eaa95394fec7a87795533b816df6483e -:00db10e4afa16bf9563e6790740d8d7f51faf4 -:00db206f104ad2fb2e41dedfad9ad48b8b5dca -:00db30904246bf5a5a89fc978a02245eaae623 -:00db4051dc4aaa183d0a0764b06aa72673c04a -:00db50e180cb6ade28c514281283708cbdb20c -:00db6052612b19419b2527687496c4336c946a -:00db70fefe12cc571711da5a775ac6fd43b071 -:00db80423dd4f7429fae2a3e31ed11953c880a -:00db90e178100d9dfa7090bdb5a425669280b2 -:00dba0fce4278f99fce4a5abca3c366503522c -:00dbb006118a1aa4e7a2422658408a615f2a64 -:00dbc0d46e7f542b8d8acf539b810038cb5f8e -:00dbd08ca482247fdeb71ca0173aab0ed30e35 -:00dbe097ce591f25d8dd35218589ffed9dee3a -:00dbf0b621d8640e287637948338c77436d8cf -:00dc00505fb03b499732e672a93f31c0aacfd0 -:00dc10688fd68cb65ed0f54bad3735ce598bdc -:00dc2045a84c3630a0887f123e920300253fc1 -:00dc303b3c60f6ce38690fe8a38a1a402bb8cf -:00dc40bf33d2ed4d1b313e39a3c222e4f6a4a3 -:00dc50faacc97537595012d98b8e94ad627457 -:00dc60ce24ec914b37da6a636e85d6bb236c24 -:00dc701fb7ece50061b32fdefc310541304075 -:00dc80e24f24fb88cc02b4a41a52b986b315e7 -:00dc90ce1f05af2310245978807db2e06ad545 -:00dca0f78be9280f921a75e462bb07d8248d94 -:00dcb054efd94445edf1433c60b2db3923abc1 -:00dcc09c129ac26d5ab5c4e271d8864134c5aa -:00dcd042fccf9dd2cca9795682ed3b55d5f89f -:00dce037ff27cf58919d8adedfed1847e1d01d -:00dcf04fcedaa20538ca4aba34996eb65bc9a8 -:00dd0007376bcda25558a32b8eff1f70b82277 -:00dd10b1eba047a5727a58a5a893e2068719a0 -:00dd208f1cec4fb439c5af79ba26eeeecefbdf -:00dd3099d2c73d6010fad18a33479e45d5c535 -:00dd4016c65197cffb8f916cca49c122a6fb3b -:00dd507af7d39062290b29f836c1ca9919d9f8 -:00dd60092f62d1dc14f804235cc24d8dd96947 -:00dd703a1149e493020bd04a2da1263ec0ba2d -:00dd80e58d5a51bf2d0810638fb721b460fa17 -:00dd90f3aa52499e9181b9aa87379aff71bf01 -:00dda0fc7d6bb902e28a91390f9f03bf4b5c9d -:00ddb04b6f9f2074da3e12771323d2e17a25e7 -:00ddc0b09acfaf642001094d839bca85f052d3 -:00ddd0bdddd3e848fc3e5f8993904dee846654 -:00dde086eaaebfab5ebf5ddfd9e79fbc24f4df -:00ddf0b04d04efddfae269d97d2f42f3131209 -:00de0036fd927f037fd48e951a2064a278406e -:00de101668f92b0a4183091b9640e9bb4bd4c6 -:00de2042a9399c4ead7752f2bed0b6f3c679c7 -:00de3030323cdf0fc565884ac85e40ffeb1971 -:00de409c3d1011154ba52a15d127ed5b601645 -:00de5095408941a0f9171ed7102bf069b5f4a3 -:00de6008d08c5ac10df738fd84ba49a5f0f86f -:00de70e67f0b6dd80ef1d7fb10b9850f91bbd4 -:00de80e721c907888258a7ac173bd3c44a43eb -:00de90dff78a1978eb9119828861d3b181d510 -:00dea02d4ec2819d4e31fbd51a8c6b6eb8e304 -:00deb07d73ab260850b40405ba257762c91641 -:00dec028907c8dd4d98dc624300df48ffc6d95 -:00ded040b23e7384e487e321325c016519acf7 -:00dee0e5dfb874779deae42c40013dfa3a44b2 -:00def000189aa5aeefb0eee0b2bd3449e45c07 -:00df00df722082058c38d40278206af6b8617c -:00df10cf0aa621103ff905d6a449bab0459128 -:00df20ad1aacd4790e81a8c12b2e57dc8d9729 -:00df308ec3e26c5b22dd6794c3903ea774cbbe -:00df407bce5f4b9e44da6a2f01adae1544d3a0 -:00df500dc54a1b5719155cd79e9a76f1ac5d20 -:00df6048f948eecf7e8c21611061acd77d5e16 -:00df70dcb763f57c3f53339a45aa5963232baa -:00df80056ca21f0b9c654de0d336f38656d549 -:00df905d47b35bec9cfd9cd2f00409f346da19 -:00dfa0a03e33cb6a65f42078893975a747e022 -:00dfb055ed56a9ea5db04a8c5d8994501835e7 -:00dfc0cdf388e1fad2e71cc614b8d7c105a094 -:00dfd0014e8b8ce005ffe7a1d6a2672603ccd1 -:00dfe0ab379bd66e5279b198fd1bf7ae35c6a3 -:00dff03cb990dc1fdaff53ae2aa1dfd213a19f -:00e00027a2460f16c81229e547294109a18999 -:00e010c89ae134217de525eab95d20096afc6a -:00e02084e74901ae6bcac000931900e07cbda9 -:00e030e89586fbc46eb0f25db4d167a38bbd09 -:00e040d5b13cc9d0c34a469a9dde6104297dec -:00e0502ff991d60df44a577636cccc30439b86 -:00e060124be26bf067752097391ca005ddc168 -:00e070fa2827941c5fb4b01857a16e9c5039d5 -:00e080a4a13b618335127c7c58ec4d293f2d08 -:00e090c0db811eae8cda495eb3dd14e644acbc -:00e0a0d2a122501a9575f48b3b62c4fe726f4f -:00e0b0903dcdc4b64922b5006616d7c0c0cb4e -:00e0c03afaafda13a6197556a9b38a17c35583 -:00e0d05bbc2034eced5102ee23dc1ab0bd760d -:00e0e02f5d62c1cbd24f48078050a49058bbe8 -:00e0f00bce258440e7bade115ea334e11c4441 -:00e100621cf904a7ae41157a3f870fa9041afc -:00e110c8dcc4a3b5895988896f32f4a1c883e3 -:00e12053ca82943807c6da8cd6d3083102d8a4 -:00e130f8d9916c08b87e95cd862424576274f3 -:00e140230d0d46b2392b2bf317d45e52d679e5 -:00e1502190138146a36b3541ac00e02fea7767 -:00e1601e7572f8070a9d1ef4a2cdac584008fc -:00e170a87820949e5af970994f79ce830310a9 -:00e180f6c21de2665cf9255fd915c5c337fa38 -:00e1905bf41e0459e0d02cc2652f7e906eebfa -:00e1a0cbc281b02735479b8ad1311888f96a7b -:00e1b05856e3398d9f92f4a4d3f4a57693aa67 -:00e1c052586c7d46b0c793924d488e27ffbce0 -:00e1d0463bb0f0fc29242e7cdb73e208d1529b -:00e1e0343b65f3848d5d1ed94211d262a1f579 -:00e1f063069f8a52983fff0e22f12e0a3fb023 -:00e20052248606b63be7bca9d4bbfda46609bc -:00e210e957601ada3c9a3d0d36576600bd8bfc -:00e220507500c3732a859c6dc160d00672b4bf -:00e2304a6d46bbe401d1a253c924bcfa3321ce -:00e240b0add4224c6fe420a42df903fb294352 -:00e250a7f0f943d2221fbac5f11a5b9d367a7e -:00e26082f35bf1c2361ee69ecd094d18c5293d -:00e270ce3e3cfb639be07d87ca55e52c477ce4 -:00e2800a7018e24562f25494c14f978c8cfdf9 -:00e2904e2bf0c68df030e5b35a3a0431c93c88 -:00e2a0cdfabd76251880d94870af9a2b1dad75 -:00e2b034000b209a7718b64fdcd287b8922568 -:00e2c00ef21bb4898f9b01a4083f4e4faf73a2 -:00e2d01efc84bc2e2819d63722ec2685a3cf44 -:00e2e01326107ffb4a17620b714ad2f2df29bc -:00e2f0ca2f702284f2b37ebc4be73bc9fd826b -:00e300146d0330be1e5e054de8cbb4fd1b9e6a -:00e3108a9c9254d9c3bb6d7b9ea80b44febc93 -:00e320c09f9cf9a18715edf8c3276d545ac29b -:00e330cf471139da20ed207a6823bfee7c9199 -:00e340a3ce096f3fd9635660ac8641e2f0e0c8 -:00e350e0af2107d719a9a879b70bd576adde33 -:00e360a812a6e270dbc104ed1ed343b7eac756 -:00e370b8a9c5f22a21a79be504a7e912a93e69 -:00e380ca395d43bdc0202ba1b7750e592ec9d6 -:00e39008067df756066b26441a0ed202b58e13 -:00e3a0ca47db518bccabd60283bdea5bd6d3e6 -:00e3b0cd79e0369f2d5d7b6a3f7f11ff3e917c -:00e3c05e40249de808d48aac3077456151b213 -:00e3d07c585b4d323222c590b809b0e24fd954 -:00e3e085f444951c3eda486301b14ea292f345 -:00e3f0a0dda98117a15b15b5b7356520979f3c -:00e40065700ff65a13d7f14c7ad9754a596722 -:00e41044a054901b6e9cf3474951f0a6eb1187 -:00e4208ded5bfd6261c4903c6dddc41d21238f -:00e4308c660f00b5562ed6ed2c88df06c75cec -:00e440bc04ea092905550424efc933ee5faea8 -:00e450f5f4b581f5a8ce0937ab93f57f98c1d5 -:00e460bef23a15750fe8f093342538c0a92ba9 -:00e4701d66bd8d2e3b5688e748592e9e59b87b -:00e480a42863ff9afaa843807d3789394bfb04 -:00e49067c687bcc1a65d50dda23aaa64593926 -:00e4a0ec39bd876c1142ba3cf063d84bb55b5e -:00e4b08a047abd68df652d0efe2cc32cfef6bb -:00e4c0444c17e498e3d123f390a60b6c419542 -:00e4d0465e29b6dcfe07999e6c030bf968201e -:00e4e01132780257278578f51844588293acb1 -:00e4f015b183b49d5fbe23f71bb4542ea4a535 -:00e500b15b13cf2adbf77eea9ae2d4373744fc -:00e51017ffc1add12e29a5100905b2f41d5eb0 -:00e5207c835fce590be847268c5a32eb60a393 -:00e530a50aacd3972d7f87508969f81fd6dc18 -:00e5402e151471aeb350312232eb92666cb74d -:00e5509e7f7fdcbd794fa088522b12b55b4983 -:00e560598b715590be0d28c59ab0452815d885 -:00e5708500562b35d4514b171c294e797d41d3 -:00e5803d6cd7cb3cd71e26f4ef3adc417cc25c -:00e590c8a1804b5561c7a4afeb0f2aeb3b3339 -:00e5a03ecf4e87239be66f2e905dda13a8d85a -:00e5b0a3cb6ba655ab4de86d04761929097e29 -:00e5c02aa3d22bbf41c77a2babf2e2a19ed2d2 -:00e5d07ceb4915b6a3eeb465275878e6c65181 -:00e5e0763a8bb3738dc16738151196f144de5a -:00e5f0e10f0f9f683abafbe107883dc72ad926 -:00e600745d471260057f22fe11c2b51843b725 -:00e610946ee7db46b012b2484bc75686c2ddfb -:00e620c15db3a0fce6d46829b66fc04ffd8b24 -:00e6306dd94a8a1d6ff0eee75d087df88b7d8c -:00e640d0c5146267d9ee1d24ad68f614ba49eb -:00e650e17b6d54d1502519937b84cffc7ff561 -:00e66055cab99a2c77d1c9f1bb285d9c7b889a -:00e6703f445f3d7905f863e0d9077e2ede0e78 -:00e6806eb323a4c64bd46b2d14088b02a1439f -:00e690bfcd2208471418ecb2a98152caa6047b -:00e6a0c916ff3bfdfdbd3e723704292b5608e2 -:00e6b00ef13d2a222ee3c5a685e7f45372ca05 -:00e6c0f5cf4363af5fdd150ed6ae7bf8a48951 -:00e6d033e31a2ec3c61f954aa7ac93b25190f3 -:00e6e04d7808b0f46379cc26e27735ea80ecb0 -:00e6f029a3ec75c1d3b52a7c7b195742cd608f -:00e700268a46b97dbb298b7c36062a92091f2b -:00e710c33c05d3e3a951a6aa4c23b00b99352f -:00e720f658499f77604b6edfa059fc42541e31 -:00e730a9ac66bf3969427c85076f1b8c2cdac5 -:00e740883ac62f873b63e67cc754530fdcadc6 -:00e750c625ecda6691255788bd243feaef1baf -:00e760d307752602c1b9697d9127e15b654f92 -:00e77063153cb9d407ae718c75e7b40847576d -:00e780f26a2457c172b3b0cf011f8495849d7f -:00e790d2ab5399436a039ac5bd1aa3fb2208a1 -:00e7a0a7083a4a9db4f3a6ac2159c4d2922a80 -:00e7b0b1d4bfdebff4d2b8db0049554642c671 -:00e7c03efa68c00ee8e2d615d3513766afca67 -:00e7d098a4930612e7d7dc1c9286bb5968b095 -:00e7e062a575534f7302929c26db67ce77a81f -:00e7f07967aad64f88cedf2c7058ffe4f21224 -:00e800281b76e19f1f470c346ba40134b1a27b -:00e810fd77f961e407e67b3fb0dc0b9a9d64f3 -:00e82047fb048eb6827360c636ef680c19d79a -:00e8307efcf91aef2f80f6d76966cfd334981d -:00e8407e72b3d5f7f8c751b96840135d2afc87 -:00e850370f278a46afd16fa8087ef0c2692276 -:00e86024bd765596850a005189748576cff0d4 -:00e870edde18a702568ceae556170c6e8aff37 -:00e8800dc811f5f53bafc4dc27d83f3be63021 -:00e8903bf3e3d871da3bbd3ba5359bf8ec30f9 -:00e8a09d6cd15ec2e908492caee3352eaeae7c -:00e8b06b8c16374073b0ae490878633bcd9514 -:00e8c0dde01db56af3099549f13fd563e6402a -:00e8d04fe38ebaea0f34c861eb1e9bada8440c -:00e8e0fdf52b15d5d09e50879398c275100298 -:00e8f06b94a285aa812634a48542c5ffb0c993 -:00e9004ccacc9e12f01db3076cb37e59cc9150 -:00e9101f8fac94c5f326fd83c3b9e9a48d1a88 -:00e9200049195f74e0832551b3dd727a2ae2b8 -:00e9302b9a1ecc007dbfe867369062f93eae5c -:00e940a490aa152c112b3f319115b89913f6b0 -:00e950d9c2a1fcc4a561e44947079454d73f9d -:00e960ac1cdc11f890730529e140b2ec9a2f4c -:00e970117cb4f47367eb95419c3c0ee3bf0a46 -:00e980e77c953daee915deddef8f3b5cd8db57 -:00e9906fd3dfb5e4e9eaabaff088c247732277 -:00e9a066b590d66b0622b0609637db778c4fe7 -:00e9b008f2833b8c855b2f9c4343f36c374d18 -:00e9c0d94a84b32b8f418e71086e8fc0f93a85 -:00e9d0d10efcea985ef55457c0cdd9842d4563 -:00e9e00c87e36df2dbd1378bba25ba8a74c408 -:00e9f067e85724bf2bd61c4234725efd4997a5 -:00ea00061ac7fb42ce8e06547335adf4a4822b -:00ea10dc985bc369a889107541a43a73240031 -:00ea20d3fd54031dd09f99a5613551513afc31 -:00ea30c216a5f3f252e30cfdc83c7b005b4332 -:00ea40325c36153a539d18267f25fa6a1b8021 -:00ea50d66761c5b5fa711e3071bc2a1ca095ee -:00ea60941d52f5ccbd1f5371dad5f457338e4a -:00ea70332f0cf043d18b1c920743f63f1d46e7 -:00ea80cda976372ed7b0acf840ff26eaebac9b -:00ea9032b60aa52ec7506cc49e47f117267ffa -:00eaa0b56c584b7e466cc1cf9f256278a55137 -:00eab08c8d9a86cbe682c5a68659012c6d4fa9 -:00eac08b35ebb859e0c390f9071e2db01d7f44 -:00ead078df30ee4bc0577e8b16c1374027fff0 -:00eae05cd23c9675241d13fa6f584068fbdbe8 -:00eaf0d111d3c3ea1cd73cbce0d12128a03139 -:00eb000dbff85a23151a4d4695b5ba009c235b -:00eb1055ebe0c5c241b8bb7116d3e3e4ff42f9 -:00eb20c33b82135c84769ad3de2e7670d5f7cc -:00eb30e7bfc39f5e11d8191841c1a6539e1e43 -:00eb40f230346e57d578f43f1b6167a71f4b4b -:00eb50ce8ffbe236ab76ac5f6ee1b143318dc8 -:00eb60e10132c79f2917a731e4065434f8957f -:00eb706f6892d4f1d48d4b8080a1741e7689d7 -:00eb80d117b6802b91e5940803ad89ed74a8e3 -:00eb907d3b53f48a83f93d2aa3e1b45adff4d2 -:00eba01d138a08157720db95c42066fe1425f0 -:00ebb07fd48378b01e8e483b14d59b48244c42 -:00ebc0b4b624326e5cae1b8eb98757c4d43941 -:00ebd06213a8f1d3117da4a24fdcb16b5dd9af -:00ebe0b9c43c8ce6359ff676ea9bc574c0ab75 -:00ebf0226b64ad54a05ce09aad0162023e4514 -:00ec0024029ab07c1cafa7ccfc2ced864fb261 -:00ec108c1c94afbf2802c29918d35848b3f636 -:00ec2009d799ed6462248d03051fced0feba3e -:00ec305602229adb70fd928b3e315f7bfa4cc8 -:00ec401a73807085c210a23810e13d15c9da19 -:00ec50183890d918176146e8d03d5a7cbb820b -:00ec60f3bef3d9fc5a2e15bd1ee34b67df08db -:00ec705ec0485928e24cf9ff68990a72c2a7c5 -:00ec80f3b2cb605608941604ae7ad33e18f177 -:00ec90e693c02e3de548599a3e9dd468c8291f -:00eca07877008048bea0697bbfa619f3c2a7b0 -:00ecb0ee7d06ac5d90ead148c5a09f141aa0f7 -:00ecc0e78a22c270c4e227db53ad6b1a95ba0b -:00ecd007e22d67a6a415ea56d58859ada47737 -:00ece0fd6f9f896713ff0f135add07a3582b8d -:00ecf0a9d9f87f298c31f83438cb773b770329 -:00ed0015198ae62f73cc62b892d68cc16ce3b9 -:00ed10245cff3d2efe708bec2dc83e1e43a2e2 -:00ed2078de4c94be47bb3249f3df43837b518d -:00ed3040658fd7f9ed10102e6439bee914a23d -:00ed40ebbff5c49a9392d15f3254fb99657dae -:00ed50c8686a83e190fba9868b6e97e2a07e37 -:00ed604a4c1d8ac55661905ff7efc3d6b76116 -:00ed70262ad360d8c3e7e13f0c91552d1a67b0 -:00ed803acd1d0efb25a999ab9a8b76a6cd0a29 -:00ed90f6ce5d3b210f95cd1c6464a9731f59ae -:00eda0757039cf89af36acce8eaaa92e126662 -:00edb0b0d16efde275ea9fbc84a917cb2c0c76 -:00edc09f533f68406e95c1f7571ae399bfe957 -:00edd083e7f7d04b071597e501e973cad8f078 -:00ede033be227eae4bb235cadf380296937cdd -:00edf0c8637e109788a4b147f2ee90440534f2 -:00ee00f13f34bddece6aa562449536f41361a9 -:00ee10264b126643511969739133d33e3f6832 -:00ee204a352db098b832bfd12a5b73b6c66f93 -:00ee30f5f5cd1e7911548c11b55c3b9067d79a -:00ee40ba6ac68864507cf04108d7489a5e69b0 -:00ee5031f617772715e1f152f23ac995448403 -:00ee60a42b1104d4122d91947d540938f06c55 -:00ee70c482d1628c9cc9e967db4a010d6cb7d1 -:00ee8080c657652ea5b631a31faab6d3d4e26c -:00ee90a4fe555aec302c8f43aa513780dc5d54 -:00eea01cd84b53f25d096d04fd3e4be84ef705 -:00eeb0fd6c3d83607cec28b83987efc44b1540 -:00eec0ce42fd80dbfe007096c3dc1af8b33fc4 -:00eed097ef6f20078c3626353a16cdf37a5445 -:00eee0ef04cca9406eee38e71dd0af5dbcb0a6 -:00eef02edadda60567fef45dc91735a1455e04 -:00ef00c150d640051d0d608f7a4fae5fcf3d62 -:00ef10e524c23864bbe1c0676cfac31e1af114 -:00ef2013fd17293f0d666cc34e106738b3f10e -:00ef30600bbbbebb9671e7e55fd10609aa06c2 -:00ef40d35c6c65d7778f91aafb92e1b9306d3a -:00ef506b25afcaa075b33f781e53e10cae7866 -:00ef605adf8e106591f67a5196938b1e6c8f02 -:00ef70cc84d71d6270f972be8a26392fa79592 -:00ef8050aab1c9eee131d2bdd4f26b2c37dc0c -:00ef90ffac4f585a8c380330b1189cac34a4d2 -:00efa05398f0b2c1eca2497e1f172a912f9c69 -:00efb0433da5daffb998137d4a75418b23e91c -:00efc0dce38eda606f8e40d651bc05c7af0993 -:00efd0956e906322d36a578e2cd53c71c0f809 -:00efe0cf78d4ed12bcfbde6051779138011360 -:00eff0d98bc26e5dee144de463b740945439de -:00f000ae0e79350d4e1fa74234c10dc84e2fb2 -:00f0107f6321501b3c7a49823e883cd49d8cc4 -:00f020d7c5ddf75f0d3b26acff1154fed6a033 -:00f0303fad65299ccd6c2f2de98b75db4ac659 -:00f04032e82accdd9c81fb142436e930e543cd -:00f05070838a730e162f23ad74d024686c395f -:00f0608647db3376aa2664b4ff2592b01e10a4 -:00f0706155c412f50e1ad0f2acb038ee17bd10 -:00f080b4e43d5865f096d6540722b150b9a050 -:00f09095b503a846cf90517fa4f9a733719c13 -:00f0a074b2657c429d0745c744fe2f0687f160 -:00f0b0b8d824727ad71040d5c86696a8d49cf7 -:00f0c046f19543ad415cdc50312d60202b7350 -:00f0d047ac3db44951a6ba4dc5f0a4340232fb -:00f0e04add912b8b6fcff94f36e2966ab1773d -:00f0f0caecf3abec16be754139213d5218e2b5 -:00f100ab7cd72eea6c804ef684d3c05f95dd71 -:00f1100c25c0c2ecadd40aedaef44cd733e4d7 -:00f120fdda6d0aca278da626893b38312070fc -:00f1309d606012d4c53370d9e15e15adbf1f60 -:00f1407dd6cad0d0e31bfabdadc6027c9d614f -:00f1502e6b9a880772962895bd284f08a289b6 -:00f160b0b95e8d780df980bfa172d8d256012a -:00f170f48ad2bb2020f3bdff43217957f91efa -:00f1802f587d5d01cc1aadb808deb35252194b -:00f190467250a7f76732cdaef2be109f7aeedf -:00f1a0a214576ba2fc7e345f9519024e320ce4 -:00f1b04fec45a8a8153f24e8b98fdbaddf33af -:00f1c014faec186582922f4144e92dc26b7506 -:00f1d0ccbfdbc17a2dbf2056b4ca8dc275f88b -:00f1e0f52119172a641b1215c320745df5f50c -:00f1f04234fd52e1f89155ca4601a36a215df8 -:00f200a4efb2194838db4e4449aeaeaadfff5f -:00f210e925085f2449cbce703c176d670f8c40 -:00f220f448af3f6feb743fc44077b065633db8 -:00f230cf68128341110b2748b3b6cb89df7d12 -:00f240bb39feb645ac0dfd79f6b205a824130a -:00f2503bd3ced214f08eec1b4a290f1e1f2571 -:00f260c08d3224610da165924e3356514b6208 -:00f270ab1cabe5491bc3150df06b489086243b -:00f280a9fbed2563a37a1392c97d346ae24803 -:00f2902ca93df55e4ef704fac8c4348fae219c -:00f2a044af9911a110d9c7d074935ea3fa9713 -:00f2b0c627207abb63ddd8fe3cf851fccc825c -:00f2c0f4f4fbb0428217efcbf94260c2301e0e -:00f2d0d80fa51896fd95c1123b50e9fa2e2c51 -:00f2e0c6e1a2876195c56034b55b2aa876cb4a -:00f2f099ea996a9a58131f7be45c6792d0a3d1 -:00f30000b063b6eb106748008284bee5f4ac9f -:00f310fe2dd4fa2238bb75bf75114d7d2191ef -:00f320ee5ce89924b695cecc1c20b8f42fd558 -:00f33090bb01dcc60cbd24fba26c828f23def7 -:00f3400dade4f10a490244921bee2724f0ba82 -:00f350d7106b36e338c93ae2356d72c30fb80a -:00f3604baa20ff7dc80602e34bd7a265f39c17 -:00f370258718d9776b4aeafda787477314dacf -:00f38073ceec81ff3095db78c1629d02c4a7c8 -:00f3904e8074e4aedc5b3ad41897c6e5e017e8 -:00f3a05119c7c6d45e66d036d8a31dde046e5d -:00f3b09d70efbaa9fcc99c9657451a596f6f89 -:00f3c03acfd90ea44218f3848dac0718e681f1 -:00f3d04916ff07967691c3b132916996fd2400 -:00f3e0eb5c2a84813e5e8c26321853767bdc87 -:00f3f08d9c77983dd1cf65e9458208e72f1a1a -:00f4004615b52821b12cc8cedd1f290c425cbc -:00f4108982c959528f45a5ed45c44d538d5606 -:00f4203e3d0001ef9933ddb831546c9c5894a0 -:00f430426c85ec19027bc7b71933d4ddc186f2 -:00f44002294e555be01b12869736343c888980 -:00f4500b818d0982746f8282cf519d1d847690 -:00f460c37a52863db6df822f37517c0696e5cc -:00f4700156f9feb7881158100d40409a6f1c77 -:00f480c746eed99aefb4335e0bc00eabe8de50 -:00f490f54af2ac45f5e029f330830f4cc4ed51 -:00f4a01a40436b83619b7c3c29856785a9eaf3 -:00f4b07d5a7ad60688cc247a854f41e9ce1eee -:00f4c0c928bba86fc96e6fed732e3cd3a556b6 -:00f4d0ea08e25c512555c69ea662d554a291d2 -:00f4e0ffb8c8290e917ebe7f1304727756f98b -:00f4f0ce297185b712a95796a7e9e99b1fce5d -:00f500cc80723561eeec0b70e28a05ae7bf839 -:00f510c68772f9c8f7abbec6bb340bb035425c -:00f5206c85368dc1e29c277e1eef39e2be639f -:00f530418e249f7f63f710927ac8b3ea2ab90b -:00f540affd12d89bd30457d4703ef3b648b72f -:00f55099152b39d8e10d907543b3f9ccec0948 -:00f56066d189a10e078e35b7e0ba348655405c -:00f57017c5a6772465e7c0f330872a20ec734c -:00f5805747718415b8a039c42cbcfb00e73113 -:00f590b36ac5656165a653cd0f2ecd10ceaec3 -:00f5a093bc983ce463e34f3375b24e0bd323d9 -:00f5b008b1340abe414ea603aa5c8456e04597 -:00f5c0669469cf6b20437603677d9b6b0e790d -:00f5d0ac334183df74a1a97d31502d603d8c98 -:00f5e0d1e86adc1b67d7f31a8a0b351b05f566 -:00f5f07d7a25c69d26be42c02cdabd6497f8c3 -:00f600c0f90ecab82870c73905ae75caa8eddf -:00f610868c03bd8769ce679ac952845ce9e7d2 -:00f620d702e664f1775090cefde036ad592e41 -:00f630ac163fb0e38c99fc9df99bddb9db9428 -:00f6403a45ec4e189b0707eab41f04d74b8a20 -:00f650bb4ae14de74330dfc24fd83a99137fdb -:00f6603431e582b99e89310f853836e005c1ea -:00f670c13119c6c97db353b47aa5404ea29509 -:00f680928da0e2f48deea3101ab397ac4be3a3 -:00f690d7bb13885d6a43f1900448a48d06d9cc -:00f6a0a1340b3c72734ab9dbf42a91856cd0b0 -:00f6b012383ff91519f39caf1a1a34365fa38c -:00f6c0d2ce7d5ef6259c4d7af6a7411442b7ca -:00f6d0febab4688cf76e96788db448eb5cb854 -:00f6e00dd88635f9a7f5875aaa36be5b1d0a84 -:00f6f09d70a6e051f478683d75ae4d0660a668 -:00f7000a2f1bdfc9a256a01a3e46a6875bd0df -:00f710f9ef54d389db32cad791630ccf13c42d -:00f720987cc60919c23896a2542c7d77ce8f52 -:00f7303c52928b976013e1c8c2e6c8039cad46 -:00f7405270d2c87842dfed36a2f9e20f2dd2c7 -:00f750e7fdc2149a20b4ba6b1e05418458233e -:00f7600b6d2062815ffabc9f3b56997fad86d5 -:00f770066650fc42bf5ffcd20b04995361a808 -:00f780f6f46a8161d7dd343f4aafb08539df8e -:00f7905999b2b1d7b3c3f42f7ab8b391b89e68 -:00f7a0e3f76244a9941a62590110fddcb182ae -:00f7b0356370f5437e0eb8ef0624ac277722c9 -:00f7c0f384de197a118570d621b46c8555ceb4 -:00f7d0acaf7e3a2351dddfb2cb3e0d2b18c44e -:00f7e0dc65881115c997f835e41a14339188e6 -:00f7f0235dd8059cc139f78180ade82c26ba46 -:00f8009cc5e9d6eee526dfed63450912b683a9 -:00f810fb5bf24080fb2de53ba93c64f02f1e1d -:00f8208cd4fa23c76a4ebf715a62b99be27120 -:00f83069d9a573c90203a7357f2eea4087609b -:00f8407ab9bfaaefdfddacd067aadea7cff99a -:00f850ce56613d15edd2a427a8dd7ef7f8fd55 -:00f86088271aeb8b6331cc3a8804e95286bc3d -:00f870eb6d9df166ad6dc79442bb20a624da1e -:00f880950c41d2df46a73000a052d8ae0c031c -:00f8904b80eb648af5388d18a8697090e12428 -:00f8a0b2e056c7cd043683fdec43e5418898c2 -:00f8b00cdc8906d1727b37093371e22a82b644 -:00f8c07510961445bafc7ce5b086f7cd5630d0 -:00f8d090b7a2ef6bfa0372ce4465d8f987807a -:00f8e0ac088f1076f6cd2f5a18fbde3313d14c -:00f8f0d975c6fd930eb54ffd4a8e728880a91d -:00f900c1df9016e15db80474c0d405bbd48942 -:00f9103961afc73fb116336add3df9a0c00b5c -:00f920bc642d3df216a4cdc639b2b3a2e3d16e -:00f93033ac6372e8a591d723042c2d21bf7e0c -:00f9400044a5d7d74fed2e23ab07737bc5b5b8 -:00f950570f23bee82d45e7aa27ecee18cf6571 -:00f960f466278c76b2d3d4fe9d9c23d9f0aba1 -:00f9702b6d0e68d70bd6327c75a93268de2b71 -:00f980fdfad531976fe81382270cc1142417df -:00f9907447aefe4800eccc1f1323fa8104ca1c -:00f9a0ed7e6962a5870aa43afac628281b79d5 -:00f9b00efa1df8488e9ab8f9d8878b2e692a3f -:00f9c01f7af9a9f1037bdb11796739ea3381b3 -:00f9d0e36ba1d81d23eac0da4c463d2d06d3ec -:00f9e029254d28c256181a0a51060c64bf1260 -:00f9f01837fc486d71ed0ec7549e1f85f32824 -:00fa00b533de0bd712accb13a550802ad46b91 -:00fa100739c60e2e2331afe0f21a4a86b569a5 -:00fa20ae5f7690a1b52c75c5f245bd8c6a7572 -:00fa307d337896012acd572a6203137ae1b01f -:00fa40d0d3f162599d5b3642d15d183f4a98e0 -:00fa5010aa684998b3824a48191ec18d24849e -:00fa60253efda35a8fb9b69bcb76206c46907e -:00fa70b12e14cc59ee506e74b95e7948611825 -:00fa80a20b3fba785fe2a2111a0af6596a7523 -:00fa90ce8c563b2d2430c08049eb4954ca8661 -:00faa07ec7143a875776c7d9d303da3cb85653 -:00fab0511a35f8e127bea4faf842ef99ddc1eb -:00fac024d37bcbafc76b634dee059c0b9c48e4 -:00fad02cb712cd0958401d2da73648bc6b095c -:00fae027cded5ab7b5edf5c19e697b4768d81e -:00faf0802fd989992e417a7430e4446e92a533 -:00fb001ee337ce38ea27be30647a0d9fd2bfcf -:00fb10e3f7c716666b969de657f19b96f50f38 -:00fb2029489ea956bda033337176670b781d47 -:00fb30d3458e88861a50a777a3be3d28408ec4 -:00fb4097aebb78ce6ec65209b794bfe90875fd -:00fb5018144caa9b15cadbcbdeb497cb6d3389 -:00fb601bdaadc2c143670d12c157d734138ac9 -:00fb7065ca90609e1446cbe6b96e86075c8d67 -:00fb80665c8eb1f7d660b36445ec024534b037 -:00fb90ae407cecfd4737acd603d210f498407e -:00fba0117aed0598404adf65f15986ce774979 -:00fbb00293915027f86dd9eb248b865f77afef -:00fbc0a6fd2b77210f1f0c47ee9dac5d0ba5c5 -:00fbd0551db1a7e73d01d039e733db4b261e29 -:00fbe0286501d599cb73e0a768a8b038e71556 -:00fbf007f295f88429ec9a4b798b7dfe71d9bc -:00fc00f677afb3afcd1bd2a8233e60843ec6f1 -:00fc1023658d55e7c5f513d3c09cfc49e29417 -:00fc20264a1a40c5ff1e30b550930e6272583d -:00fc301879e0d3e435d70e9a62e61a68b3c3af -:00fc40bf9e8883ce6a9ffc1adc8aec2e7b7906 -:00fc508ff2fe45945dc9cb1bcdcf8df13f47f1 -:00fc60144a3350371c19b4c5542bd56dfa53b5 -:00fc7085a171bdc426d003863a16ae710ad4c1 -:00fc808d383581fc2772081bd8e75d74441f61 -:00fc905dcb58a7a6128bfbf6f4f4356bbc1020 -:00fca0711048d047fc2f135720240390286bd3 -:00fcb0965c5a3244e30bd6d39728191dbed1c8 -:00fcc04ed6bf2291cfb1d827bc9e68b86a4f94 -:00fcd03f2908a3fe89e7bbe8b6414b6e94dd9d -:00fce0d2d2abd52b90c50fa0933b51a3ec173c -:00fcf0bcba0a8e4495c08a816a0b9bc2e05879 -:00fd0044959ea121fb5809752efa88fdd90be0 -:00fd10a43f452f9c6099596a1051084ac01d93 -:00fd206c69573ba835a835e124ef0dbd825f28 -:00fd30fba3c8f8b5c0ac5f99df24d960f375a3 -:00fd40e399cab0266ea9806950bbcf90f2bf69 -:00fd508a136a83e24adfdebec6ab0637626f76 -:00fd60000a0e4a73f1e07e37f222979abde7d0 -:00fd70cd0ead54874b48714826a0482111af9c -:00fd8095a85b8d040de0c26c31a989d29e9d1c -:00fd90b12207550c107199ed02f2011fcbc29c -:00fda0171c0e17a1fcf5125080213f4abf973b -:00fdb0c41f08a55164948c133bf9d11482a365 -:00fdc0a738f450a5b6db81598e5307797a168e -:00fdd01d5b12cee5a25666dcbc7e3781824e76 -:00fde0f81ebc9c79550e878ae133fffd1c2918 -:00fdf0176ad46126ad6e1943407069559519ee -:00fe006e5775dafb2eee77545702c191a80c48 -:00fe10f3bba988349c82256f3dfada80c58c32 -:00fe201ee40baf17f529b46d154c1fdb7912a5 -:00fe301ef3c7999798dcde71ef2af349967848 -:00fe40f2df2c863b7e8cfbfdda37418dcd7d20 -:00fe50a8b400e8b13d4152ec8f89675e87d66a -:00fe60c8620cb6dfa9f31945d3b73989033f9e -:00fe7085a2f9b9680b5a09a91946f1ce07b7eb -:00fe80f06ed6e6734670fb3aa11108ef4389f3 -:00fe90f46b0e997d7e6e9eb3e8b2d6e7db36bc -:00fea04acbe6a9cd30a451188186762586d9a3 -:00feb0287678093516d439b9913917c2f6410b -:00fec06ca44188c9349f7befd49c38c4727314 -:00fed097b87be4b20c2055f3352341e8a192e7 -:00fee035e0d0fd220b108456d0ed091465247f -:00fef0bc7fb42121a9fa2827babba4cabe60e8 -:00ff00c7aa07f71a4c47cee40b605fe304349e -:00ff10b22a5e6be7d906b8643a4128ef06adc3 -:00ff20ea549ffc9647e3b5d87945968fd7147a -:00ff3082911fe149575e7c5fd69492310aea72 -:00ff40b81bbb2082a99a8861b4600e05ae0645 -:00ff503654ef22b7737287fa8da56e43a3f6bd -:00ff60aaa65a0a4dc463843399b43a16f2d878 -:00ff70201ce584effcaf4e50ed5889558908a7 -:00ff80ffb782360f4e9d885de51e47f88c6a63 -:00ff906de2fccc1f1f06f6c2303dbde02af480 -:00ffa0cde7dfc81a86d79130292809324e0851 -:00ffb0eb6027ce6331a44a990853ed9a604164 -:00ffc0d57a4c6750ca203f78efc9c6afffeab5 -:00ffd0c903636d1911d8a926d9dbc888ab77c8 -:00ffe05ad6a207f96c8cc60f28ebc4cfa3657b -:00fff040615aa7e9bf75790565088df1a7d78b -:010000b7aeff3289dbe1678a33ba6b296835e4 -:0100108c5d6f07b5f9aa6a8b3f93d522fc705e -:0100202f999c74d3573da16410b0afb4210704 -:0100303fca9f27bcdebd17c524bbc2048b2c23 -:0100401a0683f158d927b87df823970b11f180 -:0100501316a6cf1724db88a8427b0b4c30f337 -:010060dd14d68804f3a3040b229c1f839519fe -:01007092157faec29253c7f22cc71fd5982869 -:010080f66c0677e7a5a7c9735672392ed8a914 -:0100903ea0a4355ae84b18d385096bfddb9fec -:0100a0f33ab6c7429b462d68898ae1504071a4 -:0100b046cb647c960307969a061c9d7bec516e -:0100c01e8ee36cfdd13eb7738d35ed38a33808 -:0100d0a63dc8efded3bcc9c2a14ac0cdda0332 -:0100e0415a66b0fef9ab2559ee94988c29fae2 -:0100f02264699bff222f1a75027ea4c4e294f9 -:0101005e469a62666e7cf3000a24c05ea35029 -:0101109cc9beebf66e6a81b175302e69f59fa3 -:0101209d5dbbe24d13c54ddb428d2a3e4b2b23 -:0101309c5036f2377dac3f6772545003339ca7 -:010140ecc07004f71e2a9ab9b77ececfdb8cf4 -:010150a17f036b968f3dbca3f1c4723bd20f26 -:010160e739c44e6e1f341a273ad168c51ba446 -:0101702c4726d2eba83b2be8e8629fa468e552 -:01018004c1e8d2eca601d2ab092c919924e0c5 -:010190b9870116fe73d8f5af59df718f8737b5 -:0101a00a3c094bf7442fcce8155e1c077c4568 -:0101b0d0d37ee9081b30f22c921cdc783db87c -:0101c0ba7bf4022c56a00b9b56192ef58cfdbe -:0101d0f7d0156637f50f635343e16c27c17e76 -:0101e087d626247384a61ff21dd7a2bedb7c2c -:0101f0685fbe1105eb2f7e0679837e11d562f2 -:010200d4ba143aee637598af61d9d171b73b63 -:010210ead9517d1466ab5d82bad24c5f847bb3 -:01022096a67ac014b0df619bea8427870ff40b -:01023050543ed47e251a727ace4e786d883579 -:0102404a972856ab9427204b7a351f38f32ba4 -:01025002147e39ef37871e908a42af58e64350 -:01026037845fd4cd363f6bf3ce31c1b2797f67 -:0102702f52e5a8da9ec50bd2be798ce3d3c1b1 -:01028015f5fd5630d6cc98a688556c84036a40 -:0102907e1911ef894d7d660fcc6da6c6e9509c -:0102a0f9662770e1524a3308a7bd00baf0f9ce -:0102b080f52ec0caf401f5882e783160d158a2 -:0102c01d7f58df5230c50a28f892e1ba3b16fa -:0102d0cc2a0d9c5b2e6b119171738b8a6d37a2 -:0102e0e532e66cc58af80bc14549ed6d59a8f0 -:0102f007dc731b10e2d965dfe1e918414f754b -:0103000dcabc1ff2e17e614c76726514e3e86c -:010310c4ed202dd75b3e5526a2b5dfb591ebce -:010320d7bd8f6f87e2607adbfb254c70c76d10 -:010330505ede4af93f72f15856d7ecef74a349 -:0103402d3c323b47b0aa54c3c30046a70e9dc9 -:010350c7bd967443ef0c3003433d0d12050a18 -:010360f507859d6e56bbf3f528346621e8733d -:010370d581445220575f75308832a8c9128af7 -:010380469d2cf8dab83b30031cbd19e208965e -:010390ac92daf4fd2feba66ed2cb49a364e371 -:0103a097b627a37f6f4f3f704c840b2cda9ea5 -:0103b07c2d4d8df32e8f5bf2bfbfd917aa6d46 -:0103c03003c36d349af2346e9fa1915ca0a153 -:0103d0444af4a14c2d03d656e3ea130892c523 -:0103e050afd6993089d3ddfbb8ce9aceaa9188 -:0103f04999c80ff53cf5ba727f99b14e118f7d -:010400ef5799d81256dc42389548a1589f257d -:0104109d6530ea75f07ed0848861fed21ce186 -:010420d3ae050b4906fc8daaf28659999f50f5 -:01043075acbdfc593a0356addd20a4662bd2b3 -:01044037db9fff2f6f6fe402e363ba62116774 -:0104509157630d22a2a495e0a9f8f28b0b9b41 -:010460b59f9dbccbd1a7096a75ae844303e2b5 -:010470313fc6e6fb16ab29f79027db346a7a2b -:0104807bcf5487852222e25690a50e459461ef -:010490b847051408bb43e056a8ef320b271f66 -:0104a0187020313a6bce0051a32c9772b754e1 -:0104b003943c8e1d5085acaa94009e79cddf50 -:0104c07dbd5381c01fc140532ef59efee6fb8a -:0104d0e659e33d26d597343ed928d2f010cb7e -:0104e0df25aff89e870dbc476f6e124c73c6f8 -:0104f024c3fddcffdc1ba9693407a2faeae563 -:01050019e646b6cf70d8a6513a9fe4f5af32e8 -:01051027fc35ef11e41b4a7b896ae4749e7632 -:010520c44b575038b3cb8bb68c31ca95e8dd7b -:0105304914f41ffc9bf00b70b36afa1d319d71 -:0105402ad179dd304f321da51b18e201e7e0b5 -:01055014ebe848ab39254bb136efe615b7f042 -:01056092b0014992b3c79cfa23a04086400b1e -:010570497fd93996df09bdabb7cd7615ee200b -:010580d76d6533057b869f3474af0ceba275ff -:010590f5bc0e41ea340ed125d543f1224a31ba -:0105a03ece6f4c6893b9161fae4dac6797e6c0 -:0105b060087a52e83b1b1ef7965e26e82ea181 -:0105c02cb22b641f3239e9e4c32367618f5652 -:0105d047972285cfffae1c5cba6ad8e4241884 -:0105e009cf86057cdfdf7e862487b2fe6888bc -:0105f0e3daaeb3cd0945ff85a7a6215e37746b -:010600e88a96275a0973d887129d3a0a8f7f93 -:010610f6aceb4fa735007d0a17ee0321671c13 -:01062044aae999158688e4b2dce9759c888dd9 -:010630452d2f78316669a24d8f869ec9f8ac8e -:010640e3d5f5155ed9f7f521ab2982581df684 -:0106501c34f225b5a069bf508b3209d2e563da -:01066078286bb930e7307920a8c0f739f5df09 -:0106703bf22ec88ab8ed78fb4e65ddd1fcc7b0 -:0106807d45310f957284421ae4a3e6813a1980 -:010690288c11abd048d3359611980efebd2c88 -:0106a077c3d047db85b7531daa18039ceb5a3d -:0106b0bb6c12c4bc5ddb5d3c2913cdfb3639c3 -:0106c0c71577354548561e70b06942b1fdc0dd -:0106d0960688cacc11e58393563b68bc1da83f -:0106e049aea935968997ac066eab462154af59 -:0106f023a8f26d7b5c9c7e3f0adc37016eaa29 -:0107009390e2ca7879840a662502d599dc52f6 -:0107109030192b2e4b1ab6d4afc910f47ed55a -:01072081a92c3d1c535b5d33edb0f2b15e6d15 -:01073048aef3d906b6bcb39f4374aa2e94fef9 -:0107405878f730b9c8fe602fc786868f582419 -:010750a2f1d5f34d6062d131d2dc0fe91ab6b1 -:010760def6fc6cf488b8756eb8de4f19987135 -:010770377525889b96aeffea3a24aa7cb0eafc -:010780dec00d0370381c01352b76dc0d145580 -:01079038b589f7422f421e668c9bfdd09712ac -:0107a09551e9a7bab9fd842162eec1ecfc0a63 -:0107b0be06eebb518e52e5d7671328b1637b02 -:0107c0b3f1b7fa47cbda3c6202a0a12d1f1224 -:0107d06b50305c3edcfe09abdb4d0d9481f186 -:0107e07d7dbc68437c29370953580efeffea6f -:0107f094fdd6a952ab0599a8bd974bfacd7ba7 -:0108007da2cfdd28ad5b2025a148051502a913 -:01081009c4e22dbc3c5350013fd8fdc1ee02bc -:0108203cfba1980e1da915d3532834bf7c79ac -:010830efa74402c14a21265013334f8088b6c0 -:0108401f0f84fb9457347a642af9a62f4ce97c -:0108508bc50d2dd4fec1ab5ab5541acf2f602d -:010860f0d5b425f9f79d576a46513831c0f489 -:010870c679d9aade03ae8604881bbbca0d5887 -:01088066f8805d51f1b0b904790c2185ebde60 -:0108905c0f377018115a91bbe22841fb0e77be -:0108a05bf511a3428b458f15bda4a68a4fa5c9 -:0108b0f20e1da85df7ee276ff94f55ebfc8983 -:0108c0a67ab5bcd3afb8690ede9604b1d2131e -:0108d07ad1c859c80e505014c08eeed968d90a -:0108e00556e36ce16a1bcd722263994e1a9c33 -:0108f0c0c3b9191ef07022a0f6840458162ec9 -:01090060d6150b23e4673af543816c5dda1379 -:010910ee40f9864a13fd8cc7fc3569105c5fa5 -:010920daaf1337202a75435fd7888b67dbf3c2 -:01093027c59681b98e70e1c725915ab2fe7532 -:01094025559e0efad87d95d25c0bb9a1800b1e -:010950f6f5a2a86794052e127e13102b955811 -:010960a411c4b7f9a0c18471a96ff521b05bc2 -:0109701c2208bf18e90be1055106b00d880146 -:010980d628eedad5973e877233c283b08eeb1b -:010990a1ca922239c4c51001ef84eeaba18dc8 -:0109a0f85498c3f77defd271feb0386c92bd3c -:0109b039ae20a45bf96f392ceedb420fc49d62 -:0109c0a74d7cf7b235ab1065843012ad03f581 -:0109d037b511bc197f928d3b9967b3fa09ba2e -:0109e054dca7eeeda7a5b8fdbd0fd863eabdd2 -:0109f03ad863f6f97e3ad3724b8ed5a57e12f0 -:010a0072d9de3999f0ed78d4fc838405e7c528 -:010a10c62b604a44ec653271b93e18865c6222 -:010a204ccb58b8eecc904df340cfa0fd8a1f14 -:010a30fcb2954277480ad8395da6f79c61e8aa -:010a400fbbbb24b468ae20eb1f1a321a584707 -:010a50a1050a814bab15403ec7e2e930c3ca4d -:010a60fb0c90f0ee513d083f6961e12975d0be -:010a7062a8e6bd06be376cc89c3d21bcfbe541 -:010a8022166151a05a08c34bd54f88b11fc397 -:010a908d2fb06c3bff730e530aca12614c793a -:010aa0f4c6a7a130e8f642df764cc15c10e226 -:010ab09954182570b97eb2ac92fe6b2c1ab41a -:010ac053402dbb12e29dacbf5713e3972e89e9 -:010ad00199df101d4b62be59bd8678aedd1f70 -:010ae01a6065710b65ae4b572383f6d26fb0d0 -:010af0212767f827213dfddb6370daf2486fdb -:010b008e6c69b7545a8c6ecbbebd24b810649f -:010b1060973e3908697ee5494c8ec0ed7b7c38 -:010b20bb63bca143d0b4757ec4205375b394cc -:010b30605228cdf5cf3bd29e8aa742e25a447d -:010b408c9c054e961c9606652a6473fc0d6665 -:010b5079d1f7399eeed5ec137bd94e6533aefa -:010b60293954bc8e5090de9ee68b191b233f9a -:010b701493b52fe970fe3ba2b9746b9ab11b97 -:010b806f552f8c11b48818a082676e6e673423 -:010b903a2807f0a57ced52a8ee57d0b041f9de -:010ba03a3ecbb207cf64eb30a9b1710b84bc2f -:010bb05866ff92afd9c7c674216ff08485e64b -:010bc03d367aaf61a40a89d7613d6165edb83c -:010bd014577438e74019e9afca6d7f064bf2a6 -:010be0b1d67a60efdfc90159629ef04dd8daf0 -:010bf0aee2065d8374fa2b819c2513e24f8bc4 -:010c00526e7553f13790ca78aa1a054aff002b -:010c10073126a0a726545e4b9a7834188cefc6 -:010c20e06b1e132736bc3d01f5cb34f55daaa8 -:010c305eb64f58cab56407d1f78fb4b041fc66 -:010c40e3f5668185658343d8f2966c5a19c40c -:010c50a49a2fcf42b53f71d689adad0a14a456 -:010c6039886666e09c996f5441db26df084d99 -:010c70f12c22c091559b6ab74275d9314e0d05 -:010c80cc5fac47ba1be71bac19a24dad2a6c50 -:010c9048e7354caf7a8bca6dfe418ffa949b71 -:010ca0402d041e0b46870ec7db0ccd8a59beca -:010cb09b02f29628a3a6deffa0d6d91c3f643d -:010cc0f53b92df7f2f0be238fc4b4a3d6bda01 -:010cd0be6d9fd101b937887fa6faece68f6b0d -:010ce092fb304825c57fd5df09b302a18b701c -:010cf0d9743c5c0d98bc68e40d6b15e4b31df7 -:010d0032ab4c0f64cc5345c9d37e543ef994d2 -:010d108c5e3d7d1c53c8d324a3e8f9be6b16f5 -:010d20fd3435855d4bc3f558908223011c4f5f -:010d3093e64c3c0426b6f96a85e7ba08f0ad3e -:010d40cad1fbb177701a38f88fae9bc1f50bb6 -:010d50329cf84d5dd10c9674e0a82742ecdb7b -:010d60517c30d710bb6bccb210397f54a95e85 -:010d70e43d2ee5cb2c5fc034680952abc21a75 -:010d803bef75354cb8c9a9e82181bf2eaf273c -:010d9034e23f150871a45dfcbde6cb09fc608a -:010da0d1e3425560a7796623076df4e7413c4b -:010db05ebb3b785348282156ec09d7ca5ad596 -:010dc0bcb65eb96c8b4f2ed317ed0b18aca5b0 -:010dd01bb269d616373f5322981a288c50faa2 -:010de0d13cdc8b8f756c91d0181560c608a3ce -:010df0ed910d7a58c5529e9106ff38cc597c33 -:010e00fde43291827b122384a31f8b6bb9caa5 -:010e10b2071006d79619d971111cd91ffb89dd -:010e20a6ad940c7467997689b5f04178a10d16 -:010e30bfe8521fcc743286e2523d72941dac5b -:010e400aa171e4d7959b50eafba257ee9d8374 -:010e505e9302a8a11a4189637e94f3d44d83fc -:010e6014ac43766c6251b2b1cb7d75792d801a -:010e70cd43e4cc6192a4399a490f94dbba622a -:010e80634ac7b955d8e0d8f9e6d08d27b9126d -:010e908def14ec442e80026aee0038a566577f -:010ea05a24fedd5ba77fbfccfebbfff2ef9af5 -:010eb08859491f7e41df4b92f8d8dc6c8097ef -:010ec008ad93e04cb1e865e52f2f04ba04c238 -:010ed0f98db2b4624051413552c50f452bb927 -:010ee0d4e562316a79c1f09818cdcb838a4fae -:010ef07d2b8426b9866e37331f0d2fa69b8e02 -:010f006898eb8b1c9380995ad63a1c82ed2dca -:010f106a8686c6091b08498017e7361fa12c22 -:010f2092af7590e3e168af4072a27f0b87d585 -:010f30401c3646666646a5bc043b4b6a9a4286 -:010f406310b2f640c1c9ad509b0773cc3def45 -:010f50ffb953a6bf5fd60ef5cd31cd60e14a0d -:010f60d3b0e39acd05e8ba5b8b7b903561f6a9 -:010f70589f9d2c8d14105f75591499dcea4836 -:010f806936739c073c5709dd3e5eddd65c510c -:010f900c56ee7e1653573e4814037053e1eb21 -:010fa06a1b7e1a200f76f415ef8a018180d00b -:010fb02280a7bc8b814eaa20f791010795617e -:010fc024761edb12ae1633d2abd4d58cf9fe0d -:010fd075410988e5537255aa3b056a19b17bb5 -:010fe0391e9602f75287b843c5789ae5b135bf -:010ff0115c14c04ae6ac60c0f4c2f67109a01f -:011000d60b9212eec1dc4bea1d1a9040636f05 -:01101017d94da6d462874dcd31c977e46bda4e -:01102081c56a656c891157f625c8fbe03548a8 -:0110303b5c10e4ed6058cde9f7a3b3b36c27e8 -:0110402adc0041fb7e351a5a86b4606b0808ae -:011050f7af6433546fade2135e2cbc604551a0 -:011060a717744786c9175bb040a21a7892d797 -:011070592d9259deecfa3ded789d03ebb93727 -:011080759e1f210303b5a1c1f6ec045ff7360d -:011090e776a05fdc79c2ca6f7c55c111fe70ff -:0110a035de138b3ca49dc040b594ae0bba16f1 -:0110b007b0367d68ca6639983927d7297764b0 -:0110c040e468cd8679265de48f5ebf6fca533e -:0110d0b7ece09f2a99573ce11ed7c2be724eb8 -:0110e0b9a3636543b71c9891865404f5b1e3e8 -:0110f01a34b353ea2c6ea840e049bdc58079ae -:011100dfb28a5a38f3992f073a9b8aeb739670 -:011110682e52284343fdd4452c2a8c3732186b -:0111208b5029dec31efb9687a698e45093959f -:0111308abd4ca4e1b32e084656c4603632e77b -:011140f5b13e20782daa9e15f711b82b4092ed -:011150ac8388815c52a06a3eb609def5aba35f -:011160c9d52a429c5c0c8c87de0a193c45e99f -:0111704dc6ac81b21c41d13104ba72eb978ad7 -:0111800babe97c9395a18fe8bc821da1438bb9 -:011190509f46fa52880be6258661ae42fa45c7 -:0111a0387d8f967ab78b0da0cf864465fd9f72 -:0111b06ad40ba71896f9e5dc0a9ea3d2a84b9c -:0111c0d0bd739abdc7150f6d6bfd9635df3c16 -:0111d02925c0a844367c4e766e792d814ddaf6 -:0111e0753a572889ae575f246be3ef52ebf154 -:0111f021221a463b85024721a2ea1d4e884449 -:011200d306a2486d525d9bf148ebc1207a49ed -:011210ff6555b5131dd2f89aae87e0ac99f573 -:011220e086d33a24a9fce596855f809b43f7fc -:011230bebddc008a81c2e86cb6e7068b046d75 -:011240db35607e1a1b30764eaa215142bfabd1 -:011250a4b9cb7a7aef84419e2c989be4e3f930 -:0112607fa8a19dabcb61243cc23e66716de4a6 -:0112702467187c12a0ce3eee07c6fca8b74b9b -:0112805ef40be567f1f46b550a14592ca3032f -:01129068b44561e888819cb1e708fbdefb4584 -:0112a09db7d2215344e36fa4ece922a60a430e -:0112b008debbf011cee95cae16df513f9b478d -:0112c036b6bb06965947751ce9c191cc039f72 -:0112d004cc62f3ac197130252248f741aa18f3 -:0112e03a3b877a4385afc4a89688d9ee8642f9 -:0112f04780634d1ada939c48cecb8bba2e34f4 -:01130038bc72c45354e6b84bcc5b9f5ffd0c83 -:01131016611285ebc46b3019da1773b12ffb81 -:011320d97271eed495ec9b0be1a154eb956527 -:011330fd01724542db6f68e30825987210d029 -:0113406b1dda8f0178487db357b3d6ac285ee8 -:011350c87809e3ab768266a0bde1f6eaaa578d -:011360410f744281a152af90ab8582f14f6ba0 -:0113703f43bfde90bdae9438071a6d7a43b5aa -:01138033bc72c21fdda753e64c8abf23c587f8 -:01139029011b54c8c5da772c2a30279e15f61c -:0113a024ec6c95d2ee321e6cf8ca7d105f4631 -:0113b073fc6e94272035e13c286ec98e60d971 -:0113c097e20808e9ac812b4d7698a8b1759c8b -:0113d0db0a3ba6e2c166ace7ce767e1c6b49d3 -:0113e0b3bbae59ec1296d4e41611cca6124f18 -:0113f0586b8f89fbaf16f0b1308045e77479d2 -:0114001812bc6914f78cb168d8f920c8185c16 -:011410b5f043acb6695e14faf7c93397a49242 -:011420b0533b701c4f6e3422548de89e7c2f42 -:011430062580a5db419d475706a01e2b88aa32 -:011440d5f49c11dcc97361e827dcae8a777476 -:011450ad88e7cb84d27ad9a985c54181e16a72 -:011460a68e3c1594f800aedb7666e719827ad1 -:0114703afcfaf392a682f74982bf56de8ae24b -:011480f9d12882479d6f87eb3aa1883428fb91 -:011490ab130f0fc8ec45cb1b870550b4b28473 -:0114a0d56d126a8ff15b50a9668d32dda88336 -:0114b0a33d5488b4762887cd0477e69fb0294a -:0114c09c94b68e1d1aa2ff7d06b1bcbe4587c2 -:0114d0ffafa897dd03890ed81dabd1fa65a74c -:0114e045c6717f1ec59f13d2ef46d129b2fc8a -:0114f03dbb6284fc7f9664c7f7aebacb9b1566 -:011500f5753f9b37dcee57d2cdaa813126c873 -:011510649704602e7a88f422e10a79d57ceb78 -:011520fdaaa2ed6ddc0e46193003c0d041e5e8 -:0115300b9d318ea8de017e0e1d0099d0459977 -:011540f768b4ee3f2d6f5bb26a772bc8222034 -:011550c499fe4cfc279fc2e66778b22d1ed226 -:0115607409814ddf40776356297a8103da6b72 -:011570b0c741c5cd320c44d2516b442cc3cfe3 -:011580339f987abfcd34e0ddfe09b3504212d2 -:011590e7214fe9fa65b88b39118e740ffef335 -:0115a0912a86436a206e2e530b5b7fbc08ea76 -:0115b0437c92110a441d563774d2b52f529af2 -:0115c056a201e1614b839fdea8fe1867dcb94e -:0115d08da0c89ecb3e1818c49959c3cfca6a9a -:0115e0db2060af6db4f47db556081e19dfbe90 -:0115f04004b57a036e73bd735a70c99ca62425 -:01160028e339a8065bfe793ea11d762070d27d -:01161034fd022eadfdeab0a7841a1004b4e4bd -:011620c31dd68a4b591b0ffd9f1efb150414bf -:01163001d3967f5689d2ac69244c1c6b99a820 -:011640f292e7eed3c03696d35e46dbc6621c72 -:0116505b91724872cf68eeb695229057f0d215 -:0116609d32f7e43ce8e492cdbe04747750b8d7 -:011670cbb35bd7690a94ac66b1f6c628bf8054 -:0116802005f8440d36828528f3d94cdddd44e8 -:011690e7bccd843a72aaf727aded7b862173a1 -:0116a01150cad4b34fba915309e995b6177dda -:0116b016239228f160f3e4129a22a3294703a4 -:0116c01a3f621d42ae894964fe92416d94582b -:0116d0fa7408df5b655bd40a0469f8573c55d2 -:0116e01afd7ce29d90fd99e1bdf89d61578441 -:0116f0456ff2e94dcca5882b812b6dc7073f17 -:0117003c108956c8661f791c6df840da17a143 -:011710a17978c708720bca038a93c51dcfec22 -:011720791762fd451c4a2a2f76b02efbad9b14 -:0117305fb134e8377927c1e875e99b740fca65 -:0117408cb309489a6153686497f6988838e0b2 -:01175011e4e1da8fd0310d442c39973f2c0436 -:0117605d2d2f7b5d9b719307198b8e7c63733c -:01177021d5ad5986b6077eeedb3d0a4c8e5a90 -:011780959c6817f60b1ee71760c1df87695cc5 -:0117902b53555a25369aafbde7b17eaa598882 -:0117a0b7e8876d6f06554897ce3b69b696c3d6 -:0117b0d667b1d4a20569f1aa4b6c3baf9cb5cb -:0117c0d6f1c1641fc22bb622fdba0fac927a7c -:0117d024152792b4f375a98290ea98d5f7cb02 -:0117e0ae4bfc017f2573158874777810b6562f -:0117f019d8709e257444b7e6c067d7c263798a -:01180072b1289842339830a155b45e8bfa69e7 -:011810a045e5c522c8860621fd4a0c5223043b -:0118203d9afbce14f061b80a2d6b5ece2b7de4 -:0118305267a00fb56261f02acaf0ac5c46ae01 -:0118409bb03d2108d40b46c2e9d5e4534b19c3 -:011850dca3fd1328b4cc03810628212c40d129 -:01186079a5ec0987bee60570baba9b50338ea8 -:0118705d443dcfebc774cf6a3801a2292ba9f2 -:01188033e203059b376514431667147578c3ae -:011890581ec6134293929900be7a6994b69fda -:0118a065de472da9d5716568681220cddcb4d0 -:0118b0272a6b5122dd60182a047d054316983b -:0118c0b3e33df8c991142f86f668ffa4b509d5 -:0118d00fe09eaf9deef4ca38f68ddb703e83ad -:0118e03b4cc93c46b6503f977486c69949309e -:0118f09786bfad7c1ebd8b7c161dfaf4f33444 -:01190025e10d99ea930f3cc4c6d249d11215d7 -:0119102bf18ae9090d17aa73270a2c760b23e1 -:01192039f972d90015b1bcc652ce733e2a62ac -:011930aa19d586bd5102a3871d309892e024d4 -:0119402454e4abdc28371dab51e98db9d06814 -:01195094b7560c85990df1c8941e892a06b8f6 -:011960361498c98ec33e8da15668add34f8575 -:01197048879384d4f2bfa7444d289c1bd5d075 -:011980cef1d50498ca8b41522667a6eb424d86 -:011990b8265e462eee39fcc7e5c321f01879b5 -:0119a0f141625cf10f125644bdf9745263e59e -:0119b0a3089b71aedb6afdee5c9c83755d1548 -:0119c0eaaa7b54ac982a85f067407d3d06bd4a -:0119d0b24704bd80b5c2242e726d436ba13868 -:0119e043f96bf5454e26d526dd14eb8752afa0 -:0119f0c40648e5060c77ae924e7363c1b6bf00 -:011a0039098f0bb6ec60bc52537a33aa76863a -:011a10aca11922c3918ee9491bf7f1f171a835 -:011a20fe5620c6f1dff08428f8501bc4a35daf -:011a30dcde0947dfbf04c439f3685b55403329 -:011a40e50101949be1aa45ab05d97c2a46597c -:011a502daa1ddee828bf4cc03c1d77fd0759a9 -:011a603d6a7a54ff5ec9eae6dd28064a0915c2 -:011a70628f8985e277bf0a1746f9a427c811b6 -:011a80aeb627339d95b12d2313d7825ecf220c -:011a90f58063c36d3ce81f69cc7dcb841e9b68 -:011aa02f99ac88c41c247d42d7a7069ea431a8 -:011ab0ced8a48edbd2c7152aac842e976bc461 -:011ac044a1c8cf15e0e7dcd71856253368e0a7 -:011ad05449115d659eaa8daf8ba1d6422b1ece -:011ae062a8fcd308d0832d68dca16dd892e854 -:011af0fa7eada59bca83ad2bfe9b62595db187 -:011b00e7a425e84f704d8423de8b00927d11fe -:011b1053bb2ea8e481f948b6ea294f9f559ab4 -:011b20cdab4b1a530c2a89c7b443130aa0a3d2 -:011b30726af7aa26a678c37287ae798ac9b90e -:011b40b5ca1745a3da9b38cd16f010b1cee5f9 -:011b50792bab366e65e279b74a11c99aaf4242 -:011b602031c94b70dbed7908186ec2720f6e23 -:011b702aba3ac984fe2974aa5e7afa224993af -:011b80405e8411429114d68c4a17365ab042da -:011b90c6527d85b80cd23b26c8f9c30f532236 -:011ba068ed6c0d3815d4b145e9c33829142a13 -:011bb02072cd822fe235093430e2e2c1eba88d -:011bc0be3efbe34c64cb8bb64548ca3cecade3 -:011bd0f91d44cb895287cdc09a558b65454b29 -:011be0bb9658bce5b18543f099bfbe5d395d68 -:011bf01871bb796b5d6d1251a600728178e2c8 -:011c002020afd5b30e9755ccfda345cb7344f0 -:011c10e7b0866b5c0dbd3df389278a4df1eb7b -:011c20a37bc6e6631c1deb3e80742b87afbd21 -:011c30a685840ca76d353bf86e74549d9ce81a -:011c40bbe6dd0e297bbb79eb0d22538eb8e130 -:011c50077cb8784abb22a5445f01b4f025d3c3 -:011c6007715ce44e93c0f6d3ffd5beb854d414 -:011c70e221b724a5390d5d4999fcea3fb7a75f -:011c8025f8bbf48d9b0c1bc1d81b7fe8aacaa1 -:011c905845e87501599edbb03162c099ac289d -:011ca0ddabadb6ce69a50c89c7df32747ff5af -:011cb0d08b0249fc486a947431eaff0c512dcc -:011cc0a4903874429efcd7937036e40eaadf46 -:011cd074583225852d6bd1d4ffce4ca2ad3e17 -:011ce05cc3eef980c0b515098e97d10384337b -:011cf02c181d153ee0d866b268457632a76a54 -:011d00e6880d2dac6b1be73ea5a5c6ad6a3ce9 -:011d10c6d03cd311e47824343d6e9f407fa175 -:011d208d05d20b42baadf7db5dbec2644f60f0 -:011d30828804a04098f24800683e597406e582 -:011d40e809089d2b0a330a63f64904003bbd82 -:011d50719567521166920c902ce343f7681821 -:011d60396fcd0ddaace1cdd64b4f4dadc68da1 -:011d70395496fdc2744b5bc4766b4e66b5e8aa -:011d80a2c23b1b04ade44c619807c96181f1d8 -:011d90eb5aa291e4635e2c9279f69f9d9b82eb -:011da05621ed4c5f5204829be2e60546b9f296 -:011db0b985e9706e15459e8d7d40a3cf426a61 -:011dc067e1bb89fb5c49162557a314904bc7a2 -:011dd0fa78683f89d0c6d1e0c13927335eb571 -:011de0b2e27ab4e9dd970ea707e32842581edd -:011df053db000edc5d7681bf258f103dec570b -:011e00244b3abfda22c6a5dceac948dc46e5ee -:011e103b4cc38efca66f6a5c26899ca4c84a5e -:011e20ebafcf0b2cf6a16ae3fb0a7df0b859a8 -:011e303e595b4ee831b5a3434c4d0f23989c95 -:011e4099f91e5fe65b22f8ae1308fbeb4ceb67 -:011e50ff2e3d7d6a70421e73039152e398cdf0 -:011e60204c834a7ae98751e3d280ab1feff9d9 -:011e70d95848c289fdc6f86e009122122ebf9c -:011e80687c1149d0afb3e3592af6160112db1d -:011e90233a8f16321e8cc2dc8a3a7cdc9c0602 -:011ea00ddc144a025d017580d7c233ff84fb70 -:011eb0f7fc33e88d4717179346af5cc6b83771 -:011ec06db9cc69581c681e27c4f3d2e26c4c33 -:011ed0f0c8247c126320563315ded1991ee996 -:011ee0e7e573cb105d8ca0c5dc2e2981cacadd -:011ef0132621ad1d17e6da229e4b29b29c210d -:011f0048a17eef013c7180e5b333d49aeda7f8 -:011f1058fd400775ff9512d1b820f7faea3380 -:011f20420513d3c7462e7f4b5b809127aef448 -:011f301f890d523a36b8b352ac46a56cfa202e -:011f40c8552c2456b32c5d5756ee855d54ce44 -:011f507d5833757ead4663ce822c9a62b60394 -:011f60592656360b4655fdf3599814b1391c90 -:011f708611c93ab88bc9947faa6819474db2b1 -:011f80034422281ce4dd884b8875a556cfc601 -:011f9018960c3bbf98eeefa51ea7120b52c8a4 -:011fa059e9ca2efb5cdc1b93c254a935e58922 -:011fb0f824f384e204d08060c982e7ebfb27ab -:011fc056919a400470331530aed0b5f6db5501 -:011fd0d47f0f45b322e49a6e5ec6d9b4c7f5cd -:011fe0f329cc2eddb87a17cb6a23190042840b -:011ff053d6fd15600b0b31c4861ca9f3caf7c2 -:01200060338717250189f1ad1bbe5b2dd89034 -:012010d02fe04f6773ae32db4cf46b4b81cc26 -:012020a43700e5153cccf020a77c0436237c1b -:012030e4602be398f594ecf97a0c3d316ec288 -:0120400854828544667813e4e29c38bd29b0db -:01205018b30d14c54ef505c144d58661448120 -:0120607df3173d27ffe166ffb54685a312e920 -:0120707154534a575eed638d026087ad2abe8a -:0120801aed9f5e179591b7f606b3f7b5483be0 -:01209014b11f1bb6b91dc0dc1ccbd0c3835cf7 -:0120a041c4a772a986ee0e522a7769fb00dab4 -:0120b004db330fba28279552f0c97ae719430a -:0120c0e818415dbf855cbfd784d5a9a605533b -:0120d0ce6d0c7b07596aaf0f114fc4e6afe566 -:0120e0de083e3068e66015ac596125218eb2dc -:0120f09134c17c3b75a3c796ccf56cce282dd1 -:0121003d95bdbf903730feab9eb9341c07fdb9 -:01211096ef358f0b2222c40905029f587da91b -:01212062cd31ff39308cdbd3b9346c2c4bbfe1 -:012130d1ddf8813cad7d0a35907156cb1d4601 -:01214090845533de17ddc1a7c0c40f3aaabd5f -:012150ce2d26951578aa21e34c68d08059947e -:012160f3aeb3802f4cb65b9c3e557dcbf2b919 -:01217062c2356f09d0603d91478686c28636c0 -:012180a9288e105cbc73caad328d889b97a3c6 -:012190c85625022f54d62f8cac36b6dba91569 -:0121a0ecd99f9e552d4eaefa66c25b6e92c9ad -:0121b095954a8ef334037745057e4bdb6a1d12 -:0121c0e5df402a208e6873f71aa5795aa35381 -:0121d065339455f9bc247b5ea9fbd781bd6967 -:0121e0094ab9b82735bacf5ee15e6f1669faf9 -:0121f0916482612b8f23a664eacd7e093a4a6d -:012200605a192c823f0a0694b729d564ff7b37 -:01221038f37332c23c411f2a9048ce05cadd5c -:012220759c3ccd949b6cf87558b3365cf48ae7 -:01223087b668cb37177eb5faeeedfc4a57748b -:012240f78094acf6995ebdf7ff61879884d12a -:012250abcd096dd71d627bcc6df65f4ebb8e20 -:012260c8b5ced11e0b22c701fb8c7b563aeb24 -:012270cbb3f24397e120819ab88d92d9730a2f -:0122804785be8e85046175ab9916b5c8e345a2 -:012290cd3f434901e4821e6aa992aaf79a9bdc -:0122a082512f516bae3453084682d6a7f92929 -:0122b08fd0b1bc1a4e016fcf9bb30ffe358471 -:0122c043bc58f4afc6f1c0d074dd8b6a88ccda -:0122d07d1cea1a00cb9435131079a3f1cb7256 -:0122e01d26721f41a1a017d8991664af23f56d -:0122f0d1997aa3d7cdfe37e21a1ef1aba7b8dd -:012300b97c2f677dc051d7c8bfaf1c34958f91 -:012310854a101dce5e5d607379dbf7f3830ca1 -:01232049cf3ce30bd531e5ff6166a5cce5fdf9 -:0123305e8ff09361bc67ce71a4ccc1e5079d5f -:012340f3684fe46c609c07b8967cacc025cb25 -:0123504fa313e8fadd34417fabbcb45ec6792d -:012360a3481b9ab594c3c77c7d146a375ece2d -:012370b44ca46eceff16f4b64d6d09f071d610 -:012380b6841c759a3bf437f899375489a457ee -:0123900eaaea0d1dea27524456e2395fde4643 -:0123a02718d548d928da84b30653d9d92ab151 -:0123b0cd7da9cf731526d75550275465fac3b4 -:0123c069784cbcfd7760b6ea7c1a5b57e76fd5 -:0123d0fa5aa42423504212ea5c4203a8d7bb7b -:0123e09dc239a79bcd97906fd83c56d3105193 -:0123f0cbbdc6b9f1f448df3118af6e2cc3771f -:012400b04d24811ed0b3f778ab9396f76f6aeb -:012410e041ac0d98ebd1af14249da630ef1378 -:01242074446436e2ed33e8c2eb72089b84f7d4 -:012430fd8890372ed5ef7e51023ef953cc6bb4 -:01244002411dc31a59fc0118599ff35fae45f4 -:01245068a510b3352641a6831d25d21a6a81ef -:01246014e10a13ef5c9670ac877f99e3df9d57 -:0124706a2ba86305be1ac350f7092e7580e340 -:0124802b9ffe148ba3fbbf0a152f62c241f899 -:012490c2e5df63c86d7a9f0c106148219f046d -:0124a0a6da844890ded2ec309bab251b7c3a3e -:0124b06fd9df848575a579adb0d371f263a3d5 -:0124c057137b19dfcf2dda7dd0fec98d68a1ef -:0124d07ef13ec8bc0a680e63670cdf3d0345d3 -:0124e0529ad3efcf0e841c400dbf0471542b67 -:0124f0259eb0a1f121951c548b82a356161ddb -:012500587faf1a9b5ac9a9824726c96f6bdb8a -:0125101ec9f713561cd82b7c1d9a00c222f638 -:012520c67b635fd11ab49bc2e9b8f2365d06b0 -:012530ca492accc399f3f7f2762bc3dba1765e -:01254064d5e731e41c6d5500ccb757402c3bc8 -:012550fd5287fe9d4438cfda3ea2acdeaaa201 -:012560f08095d4e1f45b547ead9c30ad6044e6 -:01257016337491ac8bcacfeb98d44704c9db17 -:012580dab121a1803f4aa2ee479a91e65dcfbb -:01259012e4715d3ce2086c96c8680fd49184d9 -:0125a06bdc20a48aa2e17ca0796c2499f2f5e5 -:0125b01db20620e25217b8fa59c7228d6f9122 -:0125c03d846a1de5ea145db138cdc9ca331dba -:0125d02777d2a02f4cc90c9abd6227b900ac92 -:0125e0263869374164ece2067192d8cb38d91d -:0125f0716023e82e25f48fc2aecaa040dac38f -:01260010160178dfbafefd99d37fd7bb56cf73 -:012610d79a362acbea718d4317aef3b7c40d45 -:012620d548347a0c92fbb76aa4dba13b93e789 -:01263063a2fb554ee9b60250a4baa776ada12b -:0126406063b522492a66a229b5472c859d5fd8 -:012650f7ba6e0a942d1c00a75d5900e30218f9 -:0126607bd8ef83f91fec0613d7ce45ca84e65e -:0126707d63f46701924d4a15802f8e8b643701 -:01268016ce26bc6f5d2a311c9400c7a402f72f -:012690bfa7058125b2d7427e3a2ee0aac33c30 -:0126a0ccf52895df71afaff08b6460bf5d9eb2 -:0126b0ca6f92774bb24141f1da195242914094 -:0126c0944b73d51234a5518d502ab8fa59f8cd -:0126d0eff513019914516022d6ad1750609ec8 -:0126e01f229df987073ba96fa985e30ab67a20 -:0126f0d5e8cbdca8aa830a07782e7f26934310 -:012700e2b77945f559b1331ab63f30cc3e324b -:0127104641da42164e65e025b4127c3ed4b925 -:0127207546236aa8714641c51461a1b4ae8402 -:012730f494a3ce1002139d40f3e7dc5fa2b26e -:012740764443c69929520a4a87455e01a65b2e -:012750fdac379e212589f3ddc040332e0a006c -:012760b742868ab6b12e1261d83c95f4aee3f7 -:0127703376e7c73f84bc36d8a83a4157781fc5 -:01278022199faa44e7aeac7b0ab7144f4fdb3b -:012790a105946af846412418cd746c1ab95e3f -:0127a0b943017ab04a5ee1491e829a13fd6b3f -:0127b01c11da0dd928c984b4234608e00ec129 -:0127c0c2d4874b00f417e177c9d7b3ba5a9c00 -:0127d0299b6136819ef1faded6cb7037bb2bd4 -:0127e0e9a311583a85efeea323dfff1405f513 -:0127f0b63f0a87f2c45a1e04c35179566275a5 -:0128004bfca95aa1491f53c52f648d4dd1ac67 -:0128100d938c77a82ea17fffbe66f36d5ad8d5 -:0128209156445b8352d663c6d0f939bf4c577e -:012830a5ef74e3a0b61e4fc3273e547df7ae64 -:0128400cbb4a2956133e754639fccc5081bd98 -:0128505a72eee1756f23e0d94a23a53c92d1da -:01286011a24ae504ac54f3bbeb3801ba881a2c -:01287018cfc11dbd20033ee550fbbd77829a8b -:012880d7a9887194e201d20119c94d37903439 -:012890c705b4cdf9d805c2c03c3837ba9992fd -:0128a0c12d5beafa8d742bbf3c541c37377b16 -:0128b0dffcc27dd558d0373230f27547471036 -:0128c08338d99cc80a678bb281ea754ac7ac02 -:0128d003503e1fd3572fd6b3b88e340af9ed3e -:0128e0aaec6468238d270e720fc3e265b596a3 -:0128f0ba47954b31d1a8f0483c4ac3e0070de8 -:012900c9326f773bf1718c05847bf5c2269ca6 -:012910d434c75424bdf0dc5b233954b32a239a -:0129204ef4d9ca35ec315cec30542746593048 -:01293005335307511e8b0f64f85e0b095ee6a9 -:012940f53426a12f2c75873f5a96e35930175f -:0129500d049efdf1841e80bba5c7036d05ad56 -:0129608a21909369020939b2592ffb7661d574 -:012970c569591898d5f5e37e6ad98006a98334 -:0129809b37a43a2b20ea834c0c4aa6cbd18ad1 -:01299044ac401b040ef32d6bc98e54c2069a30 -:0129a03f1971605321dd3dcc0047ad2e2251e5 -:0129b03923fdeb026745b0fe82f4aa0a3a0c8b -:0129c013b65d58e30866002c36936be583f3a4 -:0129d0d2bcc04200b3f2e9835a839cc2cf079b -:0129e00230a97ebf6ec50ef900db9737bc6104 -:0129f02006f065fe5066bc5933d0bdcf7d88c9 -:012a005b93610fbee28f861b68d013952c5a97 -:012a1091670c8cca371cfbeefee441a98b25be -:012a2001eeb96cd187c2cb438db07f1db57e14 -:012a30b1011d31522107f93b6db8e04bcced7c -:012a406213d9c088245324d8d562d5cea24844 -:012a50b24f70b619b37e0fa3a0f8602622a1c3 -:012a6007debcf6a568371a43404e5c3fe61e33 -:012a7033717307ead9d002662469f300ef8dba -:012a80df8601b608e71ffdabafb600f7099f6e -:012a9038ddf22b3cb4926c71d614ce32104300 -:012aa0986caeee79fda6ba34168ba3e06dc858 -:012ab0c0704bcd903cb0eff897ffeb0f13879c -:012ac0606a101dfa5709a4fab5289b86d3535b -:012ad078711e4851791c23d00eb2442aa49099 -:012ae083a4aff7aaae5a3b8cf9e2b69f142055 -:012af0c4395562d0d1f27737ee8cb5cefc5fa2 -:012b000c0c2998a634f4e16307f854c9115312 -:012b107ae1e120d0f3b76f733e1fc7c13427d5 -:012b2051f4325df475668c44ce7d80f00db091 -:012b301aa49bd68942984f310d23691e6460f0 -:012b4090c3ce4dc25ee4452b7ab372e529f228 -:012b50364206c8336425d2cd78aaa4ff8c461c -:012b609bd3f9b320253d85c04a731f81f263e0 -:012b70c0fca0f50962acc7633a975f071eb18c -:012b8042ccbafdd46ecfa74c4479b032036200 -:012b90abc0a246736e3f08d5d651fa16d2cf62 -:012ba0bbf08f1acb7f2fabe94985c4adceea62 -:012bb0ba0a69455e2f2fc8993ac2c498fe5246 -:012bc07f63fd4bffadfe571589b786d6ccefaa -:012bd03d37827ff47160e24c13aeafe6c1cbef -:012be0396f4661334773e0a33d4a876c2a7759 -:012bf0c75fc4beb267160cc74c45e8e462c2d4 -:012c00f2e01a54c4ae4732afd566512afa0c9e -:012c105722354dcc240f72b7d16ae33e26cb1b -:012c201e7eab4b71ad3e10db96b3c45d9279b1 -:012c30068350c80926381fce1c7c3a8435eeae -:012c406db0b59690b1b7ad43c4fb6ce0defa35 -:012c50f3df1c6fe30c530b1bfbba29b8660b43 -:012c6081248d74c2813dee15a124ede1cb9391 -:012c7034995952caee1e843852dcceca2cbc66 -:012c800967995209e327df15d97866f994f278 -:012c90a1876bd9957b071f176346fc39f2ab3a -:012ca02b5f6a61a91ff22811a9b4781d8bfd52 -:012cb0fe33c8e4671c0ead79b7fe8c68e1c6c4 -:012cc09e3f12d0018653da77a5fec0aa0fdd13 -:012cd079e2b23dd88935691208ee5673001890 -:012ce09b81e0ed83aeebc045f9631805475503 -:012cf0cf93b5c5f9d6def3be967844658572a1 -:012d004cba546b1c04b4bdbf78eb27a0c5e416 -:012d10c11b274f053d4b88f38664df851c5940 -:012d202bf4e9bdce8633366773c1bbafe6944e -:012d300587df358363e946e9381d255734c153 -:012d4026c61a4187d3b5439db1c7dc101530e1 -:012d5014c461f08414c66ec59b1b8c84dfc068 -:012d60c4953e3ab710f1ed5a034ad83d70e347 -:012d7067403cab8d06d10d40c3d52e4d410ca8 -:012d8012102dc1fd1bca28f91a7859602034b6 -:012d906e4e51e9a684bca93107cc96d27532b4 -:012da0547a7ae0a3a6652e53f349d9ab8c14fd -:012db0f1d29e90125652639549e72dd9d058cd -:012dc09257f7d428d974f68481bb95bc6f67c5 -:012dd0deed8178397a4cd9383652f7b6ce52ec -:012de0b024a6e5db2e59cfb85323a4f9ac0b53 -:012df0fc5494b25c9da770d5450a1904accf6f -:012e0090a4a92081df17127ff0472fddd3aae3 -:012e10b7be57f7ceb5bd44ad05ccc5f59b1699 -:012e200ca19f6c1fe3cec0fcc30d359d0b45f3 -:012e30455cf805302ddc0c9392e91c5163bf22 -:012e406aea534bb6249692506f6973c3ff64e1 -:012e5056959f69105947cbc7872cd915eef5ee -:012e607c06fb0744c4ccbb8cce58d79be01934 -:012e7025485f62b29a42b09039e5a29f3459cd -:012e80d6693fe680a5956b259d9b39107a1336 -:012e906cfbba2215dafa3c57b8c001dbc3c88c -:012ea068c1af6599f9a6d3a131a8fd0b708af3 -:012eb0f7bc1de3694a8719d690b8689f62198e -:012ec05d9f897b6ca1794ca5617a0d63cf9cb1 -:012ed0b547ee2d86e1f791c2a872315f45dee8 -:012ee056463f76f6913b8582ed8f1cdb7cf010 -:012ef09608907d2bba39d25d442b817d95b6c4 -:012f00723c779e48194cbf0fd979ff7cfdb056 -:012f102fbbabc4ede49948d9d15ef1f951865e -:012f207aa35677246b00ad62c2f1f061c23926 -:012f30e81f59b08dc83d6e9c539c1afbc3e671 -:012f40c0474f35b9737cc760c42a2620f38a79 -:012f504e55b954e070e6f6d93a53ad74216c98 -:012f60272173116d6dbd8df40f532e79781e4b -:012f7079af74301d91d0e551f0ba88d7528530 -:012f80118f5364cad4f8c3aea4e280206fea0e -:012f9003f770b8d53481bc678ed4a629868d03 -:012fa0dc61e15d83bf2c0a0c77ebd507de4790 -:012fb06c30d5248a4355d6ac51dee06905bf06 -:012fc0a09f7af2fd86dc36c44f29e3d99fe75a -:012fd09552a6556be8bd051ec89fb1add3b35b -:012fe0c511df2135380862b0aed59af2775885 -:012ff0a3e8d2a50e5c1c4acf72f06abca7d7c4 -:013000b9607d8372bdeec690a9ebb2a941e72e -:0130106a2fa1625798e985c47da2fb1923350e -:013020b67d8d2e0cec3b10135064226a2d1cec -:0130307bca5aa9d07ddb344ea79b4e9a07a2ec -:013040605d5408c98de4007970df5823fa2177 -:0130500b435c5b6df9ddca5eb15591bb40e31d -:0130604d28a6b3d35867bb36720dbc7d4bee43 -:01307000eab0ec401a301451b0d380ce01c9fb -:0130805eba615be55bb1ef7405f38bf8c9a882 -:0130907f81897e49ad1c14c62ca9fcde8772dc -:0130a0f9d699b95817bd2a276436edebeec2f7 -:0130b0031e08507359cf0c10ba8c76364d648d -:0130c0285880e86b6f10bf67a72896ee97f32c -:0130d0fc30dfd13504f812a4c623aeb5df4fe3 -:0130e0e38752a1b2761bfc615f3f169f23d393 -:0130f0d4fdc5f39d1e59d1496b23f115be727f -:01310086d38035cfb123ceee8f651228a5d5e4 -:0131109de6cb3613f678df0a7a1fc5d503f588 -:01312088fb9b2c88102236a86f40b54ae134a1 -:0131300fc0ec96681de8c7a667cccb839639ba -:01314021bfbf0e7e9d6814c01754c3f425679a -:013150b4f1e1cffb0758eed04d413b3b1f32d4 -:013160ae3051dfe642d896d75f9363eb4cd4b2 -:0131702c12f11f99d92e917488ff233610e9da -:0131809360de9f437a509267537b364296415b -:013190174463563882db423cc5cef33ca74de4 -:0131a09a9a563032dbbe54c59a2d8675bd485d -:0131b0b90708f50c90e1c7306cec64276ca1b4 -:0131c0ee66ce6c63609d8668ddd364d2224ece -:0131d0b301c772d3ac8b0081f61ba7d176f85c -:0131e0374b7ab073ac1e988c1240e4164f59c3 -:0131f0d8a2a7135fd589987383585a3538cd4b -:013200f4db633b272440f64b9602747db2d531 -:013210f78c3210d70dcfc14c296fc922811e4d -:0132205e247c90146a71f6f5ff8e082e9a1d92 -:013230451df1c5ebaabdddb3be5c5f0d0342cb -:0132408233c4d4f5982d30f5c43f4565d3f1ef -:0132502ee3844b74db80a13bb2a62aa1c85abc -:01326031f4e3095be7041f7114cc9b64fb9fa2 -:01327050558a40ad27096f7283c298eb9095b0 -:01328073942c9a208e45ac549969b219481bd0 -:013290db0af46e072bc26cc28c2d4d56c33703 -:0132a0a2c16276efc6b13286988454a15769fb -:0132b0f708c6e044a558acb1572188e7878af5 -:0132c0988e6a0b517f33ea43b90327d2adb5da -:0132d0c020359e2b3e1e663fc741777effce77 -:0132e0245ca3b0e840ff6992f29315b78ff68f -:0132f048e885b0496e7d9f6fd1e17fb227169e -:013300b10894123b048ca1528d5b421322d7fa -:0133104a03f63ebf71325f54a18ea247db5a78 -:013320cf14a707fee038537a7632dd23acbb2c -:0133306cc2e799332baef1b07c5f0b36b020ae -:013340f639ce9dd0eac52a992d10246038e876 -:013350e8a0456cdb97a70694efc42994a0f75f -:013360237c0cac7bf8ef2bfb58fff8c1bb8ec8 -:013370436620412e69dfa27e167835853798ca -:01338003aae3aa9e44c058e0a21225d726211f -:01339036f4a2ac1e52a74235c21bc7fe01ca3b -:0133a06aa0ecd52761098132cfa7f50cfb2b90 -:0133b009fdc2cdcf4c943cdf24635948f6baf2 -:0133c0cb78ad4a750354c95006ebc9f5eef2b1 -:0133d0b9c691e835b1dfc319ca5f68cdafc589 -:0133e06070efb15a6b49761866a7e08ac813c8 -:0133f067f3df8de350395b3b706b345b650d87 -:0134000c01775d797437295506ebe9ca350139 -:013410c2a028dbba86b439e6bce5cc7ee8f96c -:013420a35f02f2a295a56376d5d9a175d85b92 -:013430ed6e1be163529add7eac73abb1ff06e5 -:013440154af049e588ec80e21b7aa8c920800b -:01345068e3cb51efb6bea04dfe68faaa81326d -:01346074d35c5df0788dacdc08292055842038 -:0134704390166ffcdd0ba6ea269e2c1869de7e -:013480f3a962c48cf950716d2792c5498d37f5 -:013490c49b9ebfdd2da86fa9547af096f0d5e9 -:0134a0a76375cf83862e93887db8869cb70792 -:0134b0149ace7d8fac57655c56691f8a082c6c -:0134c04dcc48dbd50eb5fffc6c1241e2e27ddf -:0134d06a390ff0fbc0cc405073a042da05849c -:0134e01b16ad837bead7525db97a921375cbae -:0134f076d40a3ed8aa2bc37feb3971e31112ff -:0135008545475fb9de261d69296cec7313e287 -:013510b3224c14703d25e4f9bc9475a38c0900 -:01352026f3d60e3afb6f8f8eef0c046596a66d -:013530b6c9b44338d4d95647f869e36e7b11e3 -:0135406f081c4bc4fe34a2c20c716e1af85428 -:013550d3a04ea19a00a2bb14cc7e76ff6a8b4d -:0135607ca39388cf93e35e5f79e89574e3c8a2 -:013570ac64e8e29f3ce327eeab527c823022a7 -:01358040de3f3b6df283e649f57081f0e532ee -:0135902974f36413c7dca2d446ce6995e6f380 -:0135a0d186ce58cead52eaaf509c1a868a8d19 -:0135b057a373159a1a6639f5fe07082e922755 -:0135c0ebc681b9e8d67c04b489225bf52e4ad8 -:0135d0bb8c0700ad9d1c45c561ada6b01b915f -:0135e0689f5816bed667a0cd72fc0b7ca84959 -:0135f0e8a4eae66007cbef8a4adbd6ed5e7da9 -:013600e485b000dd37eb1988e0ef3d2b191423 -:013610c5e5582e00e84c2eb3c480571071ab9e -:013620692908f093dc88fef5749d96ede0c071 -:013630bef743567cef6b06d2695ae32b9905b7 -:01364003364ca368ce1a7f1330fe28c365e6fb -:01365015c37ee622cba8853a0e4130f5dcad96 -:01366075320852dd1624a632b0912ea2d93d1b -:013670dcf74ef54ae5db9fce164c6ee924bc9a -:013680e880f829314dbb46fd733e5bcfbdcefe -:013690ebd7e2d008fa0d5fd541f7c96e92fefd -:0136a07712764376b06264d983cf74556a2bba -:0136b041b54539d206631ceb8cc0beead68061 -:0136c0584eeb0a04a6295da73745f203f2512d -:0136d05c4a5102067b8d1e17c04bf408aa42b6 -:0136e0120b312643e18440027f4380076f2c3a -:0136f00f593821b036fe697c1a779b0f0c5fc9 -:01370011c2648ec3230260187fc3548e3cd629 -:013710ae5532a9b040206282f875400f7b197b -:0137203b93d03dac4aecedc148465dd088a310 -:0137306dbcf3bf57e30acb2571f6a346da3b8b -:013740259f860286645853caf7100e71e2b842 -:0137500902405e814150deada85aec73637981 -:0137608345d1088cb7bc4fc81d310398cf15df -:0137701aa71ab4d10ce8095bdaba1636278f18 -:013780da1dc7931d8ab0502b58a0a4c1485ee7 -:013790317ade51ca14f89c895b7726bbde8e6c -:0137a07c79827d2c28f4dafec9e3edbc075ca7 -:0137b037dfef1fba7d1eb46846924f2585bd3e -:0137c06381e900b2d98984ae0da745fd505e53 -:0137d0484a2035b6de2e59a75ecf27cef43c61 -:0137e024b3dd9a8544cb735404922281c42481 -:0137f0a431bc6b21f13e55bec72147c191ab28 -:013800c1828f64254a7bec19d5baf5f82b0c88 -:0138108ece174216686d080d3a2eed635930d2 -:013820928d99dff71192747617e3896a904afa -:01383019acee7f8c41b3f9533637d083e6d451 -:013840ca4c8b1d32f424a1c1c759d5377bdd4a -:013850496c46fc0a3ea267bb1abdad096ae12d -:013860aa474bb8b259570427d0566837b69c99 -:01387049099efaa8df9c6b3701c08e703af273 -:013880b716a81b8343ea01e5655a472b5ec47a -:01389041c61f5912df014d69336f3ce358d4cd -:0138a0ae98b62e49be0ba4b66ea2582aff3dcb -:0138b0e87bae476f38f3a99fb92c6145301d23 -:0138c0c1423070eb2e9a3ca320d0bc91c55715 -:0138d010066d031e36e087d07c364865d8fb48 -:0138e0c65968b6c45a44d2021e2219e8d80025 -:0138f060ee9b4867d11a6f63555b7ab7ea848a -:013900744b65c35cb63753992d3d0e6c62cb96 -:01391006aae351724a9e3f711773379f558fdf -:01392011dbfa2feae68e2e5982428e946a770a -:0139309e03f7d55017980f65eb5b01e25914b0 -:013940933ee49cbad2145f2f95774b9bbf34a2 -:013950132b351040e0513f6d7f544e81377e79 -:013960ba3afcc37e8b193fa98a70654886089c -:013970d89419cdf0c028e5e74f524b2d1921be -:01398023a415e06ef95f2ae778a3eef1bd940a -:013990e0dc818bcff64f40fcdf07ca272df028 -:0139a0a0f61ebb8e531c178b3914e17c63ed68 -:0139b06486a48e3edabcee123247ed0e32bf4d -:0139c0aa7fcdfe269adef9f17848c4a0a5cd4f -:0139d0ebce93453a08b7cf009189d0a051665f -:0139e0cf9261426ace8ae5e324dbef7b078f69 -:0139f04209f1724a7816732b5545860146a688 -:013a00b082784a5115e62a47da4df9037fd4ac -:013a1026014f3cc9cc8f429e35f9f1b51dff8c -:013a20c0038c502e3b32d6736f4bc61dddcf13 -:013a30c7e45beabc26973344cb826fdfca9598 -:013a40c3cc2df555ccbda49d0538439cc9e968 -:013a50bc561eb3276fb597018869eef1a337fe -:013a6009a1da18fc7b47e1e079047d27b96716 -:013a70334aebfdbf24575e49d996b0d0fab5e0 -:013a803e00646674bbdb94d6c357a76126ffa5 -:013a90cb59e271c50fd59c90b8c2e5cf768c44 -:013aa01f5c69a035af124a291289e82232cb26 -:013ab00011a2e357569baeea55d6569d15ca22 -:013ac0a74861e5cc1c71eb458c7204f7542f7f -:013ad084b37aa8cbd6e14e7c54a387102a1b1f -:013ae06344a01f7b3d541c64632ab371824cc5 -:013af0d338b11400e72b24ed90fdad1716b222 -:013b009d88d6c37199179d7fe47e9066adb899 -:013b10ef10003cc3ed01ccdedd909ef696e246 -:013b20ac1279cca457025900c890eacb283650 -:013b306f230ad2a0dfebd712d7310c29d85dd5 -:013b400bcb39280798a315fbd61dad2d7b652b -:013b506a9adac95985643fe824bfdd063590c3 -:013b60da2087160e412244a9763501829153b6 -:013b7040fd032b8d7d8a1545994cd62ec7163e -:013b80e277699feb300475be728cfb20adc52e -:013b90ffbf4509f7c26df23ccfa7f1d0b80d56 -:013ba02bb776bd71fbcb2cab4582337823e8ce -:013bb02fb26dec788546d5cd602b9ae044bf53 -:013bc0eb1c928c4d42e8ff13a15692eca8f792 -:013bd0f914a89e14613a640d0d9a7dc34b96c9 -:013be00b8a3d2957dffb38aef274c2eca2c082 -:013bf09e7356f3539c7532011d60423e3553a4 -:013c008a28e77e9d8b829c95f657e6fb61d467 -:013c10143092650ac8d148aadc7e25d3c1a884 -:013c20419a52dd142c66f4ae7b8964b4f68955 -:013c30608a8f565ee1c414e5285ab6a7959227 -:013c40778bb7c6998df9b1cd5908419c727d3e -:013c500a5370ffb36b7d1ad86f94995df965a0 -:013c6044d8c15cb1dbfa1a6d509836bca6d4eb -:013c709025a5db79ac2d6f9ffb99eb39989c99 -:013c803451bf0e5eb326e08e873433ccf8dbdb -:013c90854bccb300cb13ac09bf438db6cd0723 -:013ca0eca8a3e50ed11190b7aba69d6c728fdf -:013cb0b23e235532656ca9b52b34ef6c07ca3c -:013cc04b91c5d19a64224a14971cb63583fc41 -:013cd0d7c22b5baa3a500f238f43e78d8506c9 -:013ce0023eb127e56ac8e772d3a6e574d4a27d -:013cf02ff1dfa7b6975417402ee46c5b97324e -:013d005604b41fdfc9f70bb10f50ee9397b748 -:013d100545d4a00f927234fcdaffadd60e4e7b -:013d209ab1d2066927f631aea12082d9a0e068 -:013d30c639431612397bab69b94f7a8dc9fbbb -:013d4032dc7f4b6a1324cb4b5747c2b4040d33 -:013d509151ef37b5ad33e7d1dfb50c6cd56d83 -:013d603272d5d4ae720cff0a47f47514cc3d1b -:013d709a4b5265e96983ab87718479efc922d5 -:013d80cdc19f2d8293421433b89403a95ca8f7 -:013d9028b4a8f4816eda3ed74a8a569f4deabc -:013da05bedb3e9b08685b46039e55dfd4e36c2 -:013db0eeaf16a24bbb8abec88a56a98618c48f -:013dc061fc84c2af98a494984538a1124641a9 -:013dd076bb4ebc5936135ce449b8ce9f46e4fa -:013de0f7ee18b1497e10434d05d7dcc687ced9 -:013df058b6ae7ed56245a22638a84a20a60bd4 -:013e007c93fd91e934db5713ac442abc78c97d -:013e10e3bc430a2cbb7eefa1ea5182adbf9767 -:013e20f2255bce438738f43de58504857293fa -:013e30b35bf4373bf440f7c79c8e7b123db60d -:013e40ce27255848be606daa9187fb98f9bf7b -:013e50955ddcd9dda556d17ec3b348be7f7290 -:013e6054afebb1ad734f2db274cf6923866d55 -:013e7040fd74c7b143b69ffa783d9834e5bdaa -:013e802e6fd1c61ffc6a61347c4130f9907fda -:013e901389594f39bbcf674a6104b7d48ad3d8 -:013ea046d25c1426491ef00dc4bfd95d13ef19 -:013eb0c225397de9f9b5e915b291fa9f348f13 -:013ec07b5f8cfbdfbfeea280f95c5cac4ac5ca -:013ed061e4790ce9dd3bb100d1519c3c6707c5 -:013ee0d8702e93019cab3e2fc16dfd35eccf17 -:013ef03f8ec07692495c173b90d3425cf1a965 -:013f0097180cc0efdd3a8977791b4afd4a485a -:013f1082db37db901b04fce44b16a4aa125b40 -:013f20427b7f3b9c3324d5f69111a925d46ae5 -:013f3040c4edaf7256e252dcc145eec884f749 -:013f407c6bb7fe9ea86c6865faaf16ded99eb2 -:013f50422bba2abfa79219e32663f48474039d -:013f6000c74715efd02689f08e599c551a6327 -:013f70332c6b4ac56ca2bc560c4abf61b66845 -:013f80ff599cf6c382e07370974d210584f875 -:013f903992862f0aeb9061a37665d3ff201f72 -:013fa0a3e6254f3e8cde8e98e00ca9731eb594 -:013fb028ee59ff73e4682f82e03b6f6d9275fd -:013fc00ccc756f61647617754302a22fea9f80 -:013fd0482637f0d846e4d232fc23c36e03ee55 -:013fe079141d32bdfc40eea1c04d7436b96002 -:013ff070d2853e500493905dec52b62d5d67d8 -:0140003ff1f184b6d60538e7ed1c29c67b8542 -:014010fd3d6cc08d122fad6e6a8f9ffd67db34 -:014020ca6494ed3ef21c4fa5f56f3a5d658123 -:0140306dbd16e1b4112ff4896a16c752cd5060 -:01404074ef5245db7c471b302cdf3d44be9a55 -:0140500d008bc46d320dc8006123b8214296a5 -:0140600cefa663399b7df013bbdc085c08c991 -:0140708bdfd997bab51813f61bd2f0e2c26eb4 -:014080b3838db6677079d8421b30431809e9c1 -:0140906c2485898bf732052fcb26884ebf42ef -:0140a0b16dc8ecfce1bc65cf1bc8f01a203917 -:0140b06c1a0a390c8f49c615933d786e39b8ad -:0140c0bed18d93545decac19ced8e838a3fbdd -:0140d0dfc49ea366509bb377f7ef4d91b36e28 -:0140e038cdbe26bdb3bc52299dc1a1c3152c51 -:0140f0ca76c5d0cd3740ecee214cf64767b9b4 -:0141003d4cd5ec1414227a1c57b3905ecd0b96 -:014110938a476cfd1fbbdfd8e6295bd252d62b -:014120831d4aff845ae9670b2c61a590f64488 -:0141302325aaba751df5fb6e799a33c8e9cf4d -:01414074de28998662a90eff96bdb6fec190fc -:014150ff41309e5e25bdca73caa7060c394689 -:014160c19c142b243964fb4bade0d529da884e -:014170936451e901b0cd34fc483d681af0fd40 -:014180bf655eaf5bcb28da3bc0105619973c95 -:01419052a7a41cea5237cc7fb8a92593403ec9 -:0141a05e70982effd7631230b60ac9db744f9a -:0141b0045794b3e1b7c626030fcdf5be724039 -:0141c0e7076aede4db2a4e33a1b5cb6afef4c6 -:0141d0660cff7a49806618312473f73448e28d -:0141e031c2287215d73ea1d29224d516e8ead8 -:0141f09f22a041a8ed3b25783bb22fb0f9fe5a -:0142002f0d2a8a697f7758f74620b3f64c4750 -:014210bbae755c706a46ef8ba9623104007bf9 -:01422002027658d900ff498c686c351d8ce7fd -:0142305c44c98fdbb7962feb1da9c630aff4d5 -:014240ee7f9e834ad4099e9b7378db6475b912 -:01425015585efab638e4c964ba5734037f3f71 -:01426074b99d3d3997bf1b8de586eb9bb6fe04 -:014270d1301d67424f47274a9c56bff62c369a -:014280d6e373aba0caca4f4259e0422fe6d85a -:0142906c5ea567874853efcfcc36834e28b7c9 -:0142a04dbd364b0051659bd579bad5fbfaf394 -:0142b0247f079ddb205f3ff0b496f63d6c5494 -:0142c0f022e0a6b9c26c5a62bbd461f87192f9 -:0142d0b9f076489c82aa132f1f5ef7a6d815d1 -:0142e06ca78375777b33d8e1ec2eaf96d81e63 -:0142f02930d28bfcb084c5aeb215d76c0e579f -:014300dcecfdcf9981ea74e89acf7ecbac1c1d -:014310d19923c21873d9acaaac3c41d7d46a48 -:014320252676159a56120afb7cb625ae548519 -:01433014eb7d3731f055d3c34e634c64846795 -:014340710bd26391876caa314ed126f35cfdf8 -:014350d9cfc40e283872fba3eadf2c94de435e -:0143609f588e645cfe8b68b1db5f2d289d65ff -:0143706852ba1942ddca777110b7780670bfa6 -:014380294954e09096c1e59007fa4022ac15ab -:01439062df6e29e25adf18bd760479bd647514 -:0143a0c0a295a9c94e69953fa771a01645b6ae -:0143b005a467d913ad0270898977c4a638f9a8 -:0143c0f63a01e01037e8cc31145abd1f85bd86 -:0143d07c5113bf1561f8304e33b561c4e1fd5b -:0143e082596ca81791763b6197235f91c73249 -:0143f019303d9966f9787807fefdd64eb6cd71 -:014400352d6876bafa885e2a4f252eb3ba4887 -:014410e05e79faee4c808f3f9029231003afe8 -:0144206705fc8eb7c06c9855345023aac494e6 -:01443096402143d0cec2db488267abec42475e -:01444005cfd9493f19fec84447d5c8966a0844 -:01445097e6f606a8820b0dff721057da779279 -:014460cb99caac7860483c57b6e6fa699b41a1 -:014470ca6be54ea75032005ec972fde7cf9cb5 -:01448058ab808d33f28f5e13c0309caef1b61b -:014490da445a986ea1e64eb28b8637992a9251 -:0144a0220370a5bb67d66fb479ad7d6af992ad -:0144b0a89197f64373fd0e0f046b0793a5f985 -:0144c0545be9d5a0ebb0bc28c79182a7ef1c17 -:0144d00f5bc8b827d431cef13124585ebcd06c -:0144e0c6d364008215f6f52935e2493a194cff -:0144f07d9fa029b0e04cf19fb844def6384aa8 -:0145001d1623d490438d48b824b2f06dad415a -:0145101dcb30bf0acfceea8db994a566edd447 -:014520b34477a5fc7ec08bdc21744379e1b5c0 -:01453051e4253d7cc6423728f39604a88d3436 -:0145405d9279f80dcadac6dfe65a963feb64c7 -:0145506c91d68519e086b49f752db3d01cbdb7 -:0145608e721af33ff30d92f1d7f9b25732c291 -:01457027bca299e2cd5187fb6c4cc186b3638e -:0145808d8fc5838a189ef0c3cde4301fd06f7b -:01459069ed2ce8539b17a6de5df6ff07e89f56 -:0145a0ff869d7b39318df0d547d24f0f6c9d9d -:0145b09cda6bf5b8c891ad5b9938174c6ac875 -:0145c05172b1071c9a95f43302e0a1d28b8d57 -:0145d0e0afcfc139912f30bb7cb8a8d1390f5d -:0145e012b535f8996d37508672a6bb45269483 -:0145f0aac7385750da78f70eee76ebe123785a -:014600e00fb6c5a5e2998c2a9549a396464aee -:014610bd90ed5479fd319fc8f9c144c5059b6e -:0146209761ead2bc31f605f90c3deee13208f0 -:014630e55622e87636b71b19c1b58559642413 -:014640691fa9b76a9b69bf8b0341df0f1ea65e -:014650050cc8a02a23f8354b06f70278affd08 -:0146606885c271a8be55a2b30b1aa9f92e16ad -:014670ada085f6516bad5efdeb94d14b9ab886 -:0146806359d49a82fea8ee7c8058be83d67862 -:014690ec663dd3c1c9f385035e430d2df73487 -:0146a0dfd89fb549c3cceeefc31d72570f7208 -:0146b0746d28063546b8a3c9012a7248118c80 -:0146c0f45d556c3588049c2645f889004c3440 -:0146d0b52db08da876cabdad6c3e3871087ddd -:0146e0dd30d1691fb21432dd5f59b0d7c43150 -:0146f0110d18086da83764409a2c97476237c1 -:014700bee9bf2a5d28f9d03466d646a412f409 -:014710f370289dad2d7dbbc3aa0201c953eeed -:014720ee251838c34d05de33825706dd767fcb -:014730541d85a3624b0e5a0bf1b3ff183c4427 -:014740d204bf54479fa9268bf45122dfe1c10b -:014750c1b77f271f1c3ae32078788b955eadff -:01476055bc21e61c9c5b8b2d72066b74dc674a -:014770ce32f54e66123a20430bbe258ffc1104 -:014780b97d40ff0472fe0d9b9a24b2e8b27488 -:014790d51ef672bca0c9de382449744c6dc6dd -:0147a010ce504042e7f5bc3d5903b42f194715 -:0147b04e061f2abe0de9e670caa06cc87570e1 -:0147c0964101ec44363d49f750199ba33ff4c5 -:0147d084dba79d74790f91b2f1300eadcf637c -:0147e0ccc803304c5c6277a0bafeb6fd6026bd -:0147f0bac21e207216fe5096928ac50378d576 -:014800efebf852939adcab4b0ad9e4f417e1e8 -:014810957da39cf044f1b3f9ca16a9f2b85c3f -:014820c8ce14f2452b1ff3518c7e29f5cf8886 -:0148302e902ad610d83b8268e1c4883eb4e1a8 -:014840d59a6dde1375e10e25f4d77bc2b0e48c -:0148504d1112e315dd5c5a2e658bfbb375e3f6 -:014860e3beb5dd3c9f3741ff40921a38d6b1d5 -:01487080ec5b9ce35c4047c04e7f15e66daf52 -:0148808943dc1eafc089f7f0256c4d1eefa246 -:01489008dd3b7ddd39ed98da3006856f63babb -:0148a0e11adcd2194c2cf43c6a61f8f6e9a7dd -:0148b029ff42236401bc3e0ce7b4527ae44567 -:0148c098a0f384d14ffc82ecec8d991b218d04 -:0148d0e005934f3878dcfb0361abea86408ec4 -:0148e00977b54ec1e1ac105463fc1bc9c6809d -:0148f02b8b98274097bd699eee68924c0ab5bf -:014900f14f6972b1d77e7ba267edb6f7ad5e04 -:014910be32292294b746b6ff1c344e8ab04d21 -:01492069ba8940268dbe707da904191017789b -:01493050443eb075d5535f597b932842029922 -:014940258188863727ee2ed37bee7628fcdece -:0149503d0d1ac531eeb3a00440411f002084ac -:01496061eb4eccdcf46ec86b019b37e4ceffda -:014970ed99b76ea2baf2905c46ee6b6048bc23 -:0149803db06097dfe413ecfc65496d36533c26 -:01499055d8ae0e737852648d15b5bcfb3c8a2a -:0149a06426a101a6caba97b249746b181390dd -:0149b09defadfa95ca77a48a8cdd2c09b7588a -:0149c0344144141195f8682adbac452476d397 -:0149d0c1465946510544ccc086c00a9307bb0b -:0149e05b9c69cf68844197cecedd1e436b3c49 -:0149f020ec686aa89ad9abf83bd59a1dafc5a5 -:014a00bd53442873bf46d772f2645e607f235e -:014a1029843601d78cd26054267deca18be438 -:014a205787f985b2707bffd9a764854a59f062 -:014a304b96b68d426eabe2872124b658a9f914 -:014a4049d56528e791b9efcf08a169c9e8f1e4 -:014a502bff77990fd73cf99cead603519b53c2 -:014a6078a58e6589724532b83155efcc4b2459 -:014a70edce7e55e36989d7db8fbc5d27c6e1d2 -:014a80e6f09cc0aed7af4032dc404c3337a250 -:014a9010ec314c644c7b547b3a777bdd45e65c -:014aa02e561e14cc6b34b51024adb50d8b6706 -:014ab05727040a46f00320296d682cc2381051 -:014ac07b473fd061106d1ca80951943d3fea73 -:014ad046bd7ddc0cb01c2fb1d4065c4d8796b8 -:014ae0e10f379a94f0144f0de2643b636c84fe -:014af0528ad2ffd00185779e333ae071a6b5d4 -:014b00b13fc555e4d41f000715cf4f6eff9cf5 -:014b10038c240b4300c78a6dd49ab1b8b91137 -:014b20a541191553978f0ebef4c6708b2523ce -:014b305dcb3c4cc39f6456e6611941276a07e5 -:014b4040e5cb58281256fe22777f5e67eb3f4f -:014b506379af27ff493341365128439bc80ecc -:014b6077d969f1ad6fc70afc252525854f8791 -:014b702fc615aeffcdf3a64bef47f187d5c320 -:014b80a7016eb3a70fa6aa26b9fa9e02b62d41 -:014b901ca74610a2febef8b214e5a57a6a3940 -:014ba06f679457da50b5dac762f09b07646846 -:014bb0a25a6242ec84e62fed11697e8cf667b4 -:014bc07d10e27c21f5e0625f6dc9b64decd672 -:014bd0861c766ad0162c49eba140c29235d8be -:014be0a11b614387af6b7fc53325b9a417da2b -:014bf0a058ce400af4169f71c0cb6a8b01cf0d -:014c00e8fde6224ffd1c05b2225799884eb0ca -:014c10ebf6e6cda3de1794fac1bbd72dbaf58d -:014c208d352a5438bf51b2c63a918412649733 -:014c30a8592426836332f808f51f2a92c62b7f -:014c407d756c3bc88ef45bb41ad65b2f43fc41 -:014c5056fdf65c3ee2eaaa4ed45e01b1667373 -:014c60275d94cc2823e43fcb305bbe1e4ee44b -:014c70ec91f30225e0cb4081228d818c2af130 -:014c800a3df528d904c4219e530ea6f45b7e58 -:014c907e1db06808a689c7a8a7c3dcd4938532 -:014ca06bc66d2c301fa61d4fe55db42d169d0a -:014cb093b595c1958f02a895945b86aa5bb295 -:014cc08bd5558a898cbe1ad5a140009e4053b7 -:014cd05ebd69b5cddb7b66b54af141823dc383 -:014ce0ecb66eed08a3a422c7bb84fa0b0f9cb8 -:014cf035e62afb2b04b4957b8fe957e5ae1953 -:014d0070a3fa18eb38eb0cd542ec8377b712b7 -:014d1059af2a276e40b1a7f315fc449808345d -:014d20ba7f5ae781e078d85ec17a5ee9096935 -:014d30b1264f9e97ec92f9fa0159330b0fc4d9 -:014d406f44acb3e356d4290b69b1d211509e74 -:014d50a328fb27ab88a8c64bcd31b03e0fe9c0 -:014d6066304a9a1b959e4bdffc06aca983421b -:014d7057923d9d1657f229065486e5ca980339 -:014d801b056caf59772f3707993e495978ea79 -:014d90ec5b295b0591e036522d767579f241f1 -:014da04f4c4f8a8424f208124a894d0cf71fb3 -:014db0d4076f92644cf9242ab741764b69e9a2 -:014dc0a731b6d74a26aebf19950470c87bf59b -:014dd0b5115bc905a7cea53fc0608d804df7ba -:014de023c7f252ff9cd8049e2bcbb87dda1799 -:014df0c34a17d5ec020adf78e1914570099b4c -:014e0091ed00ed6a85794585a0e70a5bca1723 -:014e100a3664523ca73a1f407a833e80d401bc -:014e20b46c6ce62c3f3ca1d47d9b6ecb3c35ea -:014e302dce53add518b72604d50df00cda4216 -:014e405bbaa273bc2bb7dfec4c48c41d5db2fe -:014e50e94e0fecda1143ec3a1e942126684b28 -:014e60a269f4ffcc3421c7808ffcf261f45734 -:014e70d5745bce4dc1d3fa89074db6b0ed951d -:014e808e8aa116a4f670ef9a0ba04b6bde0b2a -:014e90ecf8e2edc2aeab024144b9cf95195e9f -:014ea029659f85937ab24f2d12403b00cf4861 -:014eb025839c621cba2cd3fb119ebac1862b74 -:014ec02197723ca35bc09624f8d1db5cab6c95 -:014ed034cc65b3b6606bfb40eff427e1c27892 -:014ee06840b63f5b46360ef203f85b38cd6f9d -:014ef095296c1a574fe8ec187052644bab65b5 -:014f0057a74e72b64407550f2368e4c9d37394 -:014f10d0276e6143920e9baa54f1a9aef87b25 -:014f206652024624abe939d0491fec4bad48b6 -:014f3057b7d8d5a30d85a4c88efb0cbc8a3cc4 -:014f40bdb302b3649d51693c1f027d8e7a1c9b -:014f509c7f3af726ccf331698d6562b67d87d0 -:014f606ec4c7ebb0becdb9e30adaa9b636714c -:014f708e61e8a95cd0730ace387399daada1ea -:014f80a503c863f87fd5be6cd38f0eab9ba77b -:014f90ac96a3a79497c83b4541c70d2a9dd203 -:014fa022e217009cbc17ffbe8e533d658db227 -:014fb0dc0d5185c9bd4af24687719e93e3d74c -:014fc0bd7da0978b60da6ba04d80e95d218903 -:014fd0bc42035ef27069b5411e1dcf5e619174 -:014fe0c09fca3247c1d5d8d3a81b4937d55010 -:014ff087eee2065b8e6d0a26c4347392959747 -:01500060b403bb8b14a429b2d5cdfaa3a35ec6 -:01501060ab390ec8e11f22686fc0bd383c89b8 -:015020e20a8f974c5babc48c12cd247c3d9e13 -:01503071b441b348632b16a83afec3fb922108 -:0150409277210225d7734acb953d43e011b628 -:015050909ae0c3f9682e2c478c5083f6d51080 -:01506070f3731b71a52c14568bd79c47ed51af -:0150705d158c562fbe0f8554088e55fae983f9 -:015080aa0e9fa4160590f42db76a8985f8723e -:01509045423b3fead8a5620334da85a66d224f -:0150a08a16bfd79a059b55e577539c80d6e5ad -:0150b0287faf1f50404081d468c2e77689657a -:0150c0e9a627bb7cf8f5b2d79376a5b265679d -:0150d05501e2dcd64428a7bb9ee06f64e81d6b -:0150e00b20a022156d2e384b1197fc57d96162 -:0150f0b437b4cfc8b156d664d69ad3754e7c1f -:01510000c4acd36336430a350d447d8830a23e -:015110b82867da2940739846477d805ada1772 -:015120150b49204380b8eb87874f03d19af17b -:0151304c2de7f631cf7df91ab024f014542266 -:015140bc825916af8e58300d1f20fe52e592eb -:01515038dcd28d6cc671978f94c01ba0b87d98 -:015160fef78e0112a170fdc5f57a24bcb2cbc5 -:015170fba8a42f7e0ab24150eb91c0fe856410 -:01518055f595eae7a966aec4c1387ff51b8d10 -:015190362c39175a13752fe1137ab93a01589e -:0151a0965607f837eeadfbb443714ea1667474 -:0151b0c7c56915841eb1fddc76e3afd79b5991 -:0151c0c319801b1e5e321fffe8f9502ce8d827 -:0151d0741c733f40de393e3b1eae02e35d6ea0 -:0151e0bbfb494bebcfc2685feedfae574cee48 -:0151f09738af9e984cc0b6cdcce09c6c237fc0 -:015200214c4de8e82993eeadb1814ab46252bc -:015210483e510d264c027efe089be3a607cbf7 -:0152202bff28e2d240cc57a8f8eb7c17ac4961 -:015230627ff0e5d1b3e6289be3e8668bc47fd9 -:0152406467293886cc3a2149e8626ec90e154c -:0152509b9a80abdb36525202e041ef22e23403 -:01526007318f4e3d4a9e00a73419b17b30cd00 -:01527069559a14d416c4e46ae3b647f490e031 -:015280e600bd9cfb048a86411076ee6f00dae4 -:0152904375c4cf68f32c126139f85757272e9c -:0152a0a40c85ba0436d1df3c07bd4ae21e747a -:0152b059cd3e279e5321187cac326df3bee76a -:0152c0a182788b89b9e462754cef26d327c691 -:0152d0575be421a152a3e556a0cd43edb5d7a3 -:0152e06ca14517c47c719a8bbb70181c1b0ed2 -:0152f019356795c802ba9d2d452e1e4398f7b3 -:015300af8667d81f3d04c420a77744f6be15cf -:01531002b4b42c2f260072de37c858bb8aa55a -:0153204af387aaa94ad94699a1fff4878ba08b -:015330813cb6c369cc310376fb3022be572185 -:0153408354284ee48f7369b750659142d6edca -:015350538bc067bca5aa8bab18e56aba8eced0 -:015360f0b3f1945f615e2926b51f8a90be7059 -:01537034cdd5119b0171e3d0157c8327fccd0e -:0153803fb53546593688bd45484717e8d13f75 -:01539041b7300cb49f23de65c959121033fef8 -:0153a027c218678a5dd8921b67dd96cddf463b -:0153b0f1b085b60a87686da30193e0ce011d41 -:0153c0751544ab63812c697ff8a50ad658364a -:0153d067f80afd69df4b82883b086750fff3d3 -:0153e048c090dc45117c2e3ddeb2b7ee527158 -:0153f02b0f18d06d658bf814f49344b84d5806 -:01540031a93f064278bef15d45509c7245b0bc -:01541050f03400ae66db505cf940c548911dad -:0154203aa2eb545793a83f9f5dc0de413bcd31 -:0154305fc571c3fca354d749de60063dae4753 -:015440a225c0a8ea0c5a900824e4b6881d9fbd -:01545056602ba4cf6a13def8cb666a6c733892 -:015460f1d30a1eb17bd6006e8d07612cedb5f5 -:01547091686fac1ff129008e92a7c7058c151e -:015480e9b4034ac030336112ee6bcb3a08087c -:015490d3b9100a41de39ae5b1e0c74c57af7e0 -:0154a01a4c1554cdf3935bb4909bb9b4124cde -:0154b0ffbbd6a2ceb70c61c46cb5ce22a1d99b -:0154c079c3fd6a919e1649b7bd1771aab3c691 -:0154d0074bba09e0d270755fe6563a41c638cb -:0154e00a87253eb7c6dc7f181422402e1d6e89 -:0154f0a241af3a9b9e1a8231aeec4665fa986a -:01550002516069df9138039660df7b26ec6e88 -:015510b6b241b9319e18a7f79c907f9bbae758 -:015520946e3c9349489c6af3178fa22e728934 -:015530b97c073975a0f7c5175c83ef77f23222 -:01554058a0f875957c2d4fc5dc26d7b9ee5a03 -:01555087c784e1f084e638c7fdab13fb031d6d -:015560f0fc86b0c9ffb465860983065fb3768f -:0155706e8d4a8142a68b317874a0c88146f236 -:015580474eefd0e44555a8f6c8bb2f58ca541e -:0155905814e35383262484fe104b953df18842 -:0155a0d69f195d32b3bf1a77975a08b4a41394 -:0155b06d31b023daf6e9e4d964f78649af905d -:0155c0eebf8865bbe9367751507b8864992984 -:0155d0aac73ec6d2b67606a8d6a3db4cdc8f36 -:0155e069a27c19bcea21925b5282cfeb3e954c -:0155f0572646014821ade9a05a086de18c05df -:01560097e578a45c74a13887a30f8d3d7be552 -:015610f154393d0e98f9cb96ee473a1e295aba -:01562027f704054602924a9678633a0f419851 -:0156301b19002aca381fd8ab1ef08ad2c3a16d -:015640713c541aa9193351557010d69d73a2c8 -:01565092d14ba6fffd7032d9880069698fb08b -:015660815c90e6b57cea1dbfd6b3db4f9730f5 -:015670cb05ffe406b88ef725154d83aa1bd199 -:015680dc01a6c51e5f576d24b508f1f0baa840 -:015690cb1305bf5362f9876d4380b632fadf84 -:0156a0513052c3ed6555878c9c8a09799f1cd8 -:0156b0de72e8ff69639e36ee7572a9a87b7157 -:0156c04030cec85f67e5c00a329b53f6f13121 -:0156d01974ca0c6bc7f5f5208d1526d272a708 -:0156e0817eeecb4842819256a33343ba00758d -:0156f02af927506f73dd3e7eb7dd36c0992cfe -:015700b7d9bdc2cf8c67f1445a787a7b2610a0 -:0157106e25f44cbacc181f5553f7e31b1d652e -:0157201e921332a1560990df0f2497344fb9d7 -:01573038807648b56f55fddd5e57224c9f8b5d -:0157400153e6dbec9b49f010826f8b6df32205 -:01575037a8f84325335997ea69ce36716ffa9d -:01576064a6bf64a478d704daa9924f99cb52e2 -:0157706ad6c10f9358b3b4bfaa64df74a5095f -:0157804257f2f32c9fb0604894dcd586b994a9 -:01579011cf4942bcfad9bd8b067a075e5f9691 -:0157a0e5955eedf59b317e4cbf6c52502cf909 -:0157b0fcffcc3da471e8bcb10a82695b8db457 -:0157c07291742e0eb8240c9a5e179f006664d3 -:0157d0ab234ad7c5b340d5fd66d0eea6bb4be5 -:0157e00e85733c29be7011cc26b813c582dc7e -:0157f0ee34c3c73a7e01475217025aac8a3691 -:015800ad9b9b1fa655ae2d9554a68815829622 -:015810d00849f2ec7b880f1741bb1497aa43b9 -:015820b5641d5b47dc95d4de8394dfa828d534 -:015830f4243f1bfd5dd4643e0b52cf7c9b8733 -:0158400676b8d1c4ef616a24d614210ffe755c -:01585065958dfe91b11fa3f77ae6ad086edbd8 -:0158601db9466aac4cdf6223369f13cbe7e2f9 -:0158709d511eabd16ab950d0e0360a95d573b6 -:0158801a313e4fa5b405b772e83a8d080088c6 -:01589066fa4ddf9f8ea6125e8eed22f3eb1bbe -:0158a0ec6f6f8d7763f28eac44bb809be51f81 -:0158b07421c0884d59ca2db17b3ad1fc32afa9 -:0158c05942e701669203474b606166c0459d53 -:0158d052f18065c398f19b563b4c55c61c2611 -:0158e04e77514930c848e29d3a593526cd8bf9 -:0158f08caed9a452862c3d2199a291e9e82f06 -:0159007de06ab695cfe38731ed50db0c39cac3 -:015910d399791a60b97aa9612721a9680ca61b -:015920b6d219c0f408e70e82fafff9cc53a2a1 -:015930e8af43a7c193fde13fd3a4a1a9f89bc7 -:01594053f14c7cddcc151dcca07fad1593ff86 -:015950fb7c2344cd909b37e28eb3c15fb7184d -:015960ea64cb0fce263a79e1d7ed59a4d561ff -:015970902c4e531c487dcca2ad25f9db808f71 -:01598093e16728e163e8ee36883dd446f4f466 -:01599053750ff7617b6f8c6c5264e5dfb04880 -:0159a0c16ed5b3f1c5beef3d828c078b6791ad -:0159b0a773cb4bb77f0c87688fe2e64a9369ab -:0159c015fc314326ab359cd89da3228a925ce5 -:0159d0d318de6fa3c5fc9b6e130a7a735f1559 -:0159e0064ae92fd5ca25846412edd81d4691f9 -:0159f034a00a4ecf9c9678f39e56c8549700c6 -:015a002910f40dc6200c2594c9a237042c4044 -:015a10e389b65dac6348d01cd13e45e42c98c5 -:015a200c3b12775342d7a1a6a32a374906d46d -:015a3096f773c0069c21ab1af836aa17f76e06 -:015a4004f7ff56da56b241c6533a3e811d6646 -:015a505a5e37c6b8cb1c4d625814f27bb57602 -:015a6078faa5424ad12ffd10cd855cb9e8def4 -:015a7038d8f5b1b4f7e46014e83501635062ce -:015a80c2eae76179ca80955ce0f7471b0e494b -:015a90487b7ebabe2a00033f9afb748cfe8025 -:015aa0bbbc1de63a7dffbad243e43f3f7e8eca -:015ab00b1ebd82e94a5c389bae8889bd251769 -:015ac0cb587d1977f076a340e9c6a5f4ae386c -:015ad07e3e792f80d239b588ac795dfbf6a12d -:015ae045dcaa8af871b9ec9d1a491547802da2 -:015af062b646519dc7d661539467e10d30da65 -:015b00a8ddcbb8a9cdc100e7ad16ed5697e21f -:015b101cc0472a67e7505c45b4e1feee654943 -:015b208cd987b264bc4fda97715e54290614e3 -:015b30c431c21af4c1d898cc73e52f8db22758 -:015b408f1397e7b1bca948b3ab425d2b067491 -:015b501053ae01dd5bf7298888176663115574 -:015b608cd284ac8b9bb4eb5cead9361b713ee3 -:015b7046df0ee6994e4b1cf4679373b06279db -:015b80058661c337368067101587ace500e13e -:015b90edae61d52f2fdd6fd8b44473a4e2ae13 -:015ba02660c05857206d477c251c12fb5825e6 -:015bb0089e32518db3fe68eb9f11daea559d24 -:015bc0422f869aa80d618c0e7261afa3b1c2ce -:015bd098578b94aaf466f295198ea69ec7ac1f -:015be09e80f605a3221160d5cd82c298132077 -:015bf098ad1f5d68170f4af3c80e0e8760e502 -:015c000f432cdd99e0152ace66eae95f7e7360 -:015c106ab5545502f4c096d92022658e13d9e1 -:015c20ef7e26af4882cc345459a2064097c487 -:015c30e230199ae2ded4858eb97612092900c1 -:015c4078a64e8f6149310bc4429234b22b515e -:015c5001f86df901cdfdbbac62c1889a81487c -:015c60400dceddc9609d81a437544a331740dd -:015c7019f5916ea9f23920d24925f7bd328dc0 -:015c80426bbe87b90972e7686e360371d83a81 -:015c90233d5d354b7c9ec50da0f12d8df9ecab -:015ca04de56af0324386bed8542a5999df186b -:015cb03b6bf2bfcebc708b309053e08a9f4baf -:015cc002ee3c68f3052f4c94b263436d9705ef -:015cd0fb6993e25e0b75d1d8188054d859ae3f -:015ce0c6e22b0044f14aad02ba95a16ce1831b -:015cf08c06314468cf47118a443217a03efad3 -:015d00c90b323a25ee66a334509db43253b370 -:015d1016c8152713d5bc2d5add61c78592dbe3 -:015d20d2606d0c823d23b8a0f3d2cffefa436a -:015d30d774f756891d0aba23a1b5b26a851006 -:015d40a91b4acc3a35386990d13a6e53c52675 -:015d50d09472c6ecbcc7fbf2b05886303cc809 -:015d60d132598317d4cc9fe61a62da054cb71a -:015d705269c37ec181856c9b5430d270eeb2c9 -:015d803fde5b1b53dac072b3e94daf5a8ae5e6 -:015d908b06aa0b8b1c00df8ba39ee209c2360c -:015da0327f3df9a62125725f3e9f39a45a59fa -:015db0568f2ded9cc094d0c38772035e34915c -:015dc0dea972c19445ca7072b01faa0499772f -:015dd0e097619e42670af94b42a9b417179186 -:015de0100ce3b995a6ade983e55fa048037e58 -:015df0dc89b272fbdf382f9d23561312db9025 -:015e008fd2defcc9fea7257d9fd75e64803a30 -:015e10f16839505ac29022e5e614228a6f53ee -:015e2012eb6d724a61da7d85a34bc482a80b9b -:015e302ec25fcf2c96060ba21dcf3bf21270e1 -:015e405df6fa01b78d2947fddb82c7648aac91 -:015e50ce9dfc161f01fcfcb3f941c6e2e0d84c -:015e608a916502044dc4607f9d8cd6e719cf55 -:015e704e0a7b1f13a57b7e3500b259dbed3299 -:015e8093fe9db3073d0916f6006fe9a7377065 -:015e90d51ba89dd55b95741dd8f2f176dc9caa -:015ea04de93120a4799b744500f61c2a9fbe88 -:015eb069fe1f71947c4729ca57c68dfc25e6ab -:015ec0c4e6959b5fd7f10082b19d025f801bd0 -:015ed0db8cacfa8d924a956eaa31e7fcdb18cc -:015ee098b88764904ce4bb9af97f7a0527895d -:015ef020546c3a8fb9087a734bb445f088f3d1 -:015f00e3a3fe9dc23555402ce13430253db983 -:015f104d26261812140f125468d0543d45b923 -:015f20862282c4a8ebb558a4789fe9b288d53d -:015f30c5f3e291fe9b4db3aa403a2784f487b4 -:015f401ed61e55ae8c9aab575e7c390cde72c3 -:015f50ea208f7a355823183ce6a6b0130bfb6d -:015f60172d0d45b3d5a6834b5c97e815bb97de -:015f70f47583bf7911420dc3ae04dd080d4049 -:015f80b8e5994c7e4a90164309cac620a787b9 -:015f90f89e5fe5b493baf83a53e5ad4b249616 -:015fa06c86322ca1d77276f285ded75eb90cda -:015fb08f738ffecc221a7320372651f6f7b472 -:015fc0980cf85b2da69eb28a79b18c4967ae4c -:015fd0e6629ad9a2f5654a0651646894c0ebcf -:015fe0292aac7c422a90ace320409c3fcf9711 -:015ff05d63d5c137b13214a77b5e686424a536 -:016000407edbe4b9abbdc75c95811cd44ac449 -:0160101480f96fbdb31414200c7316a3ec4480 -:016020f5b65e9f607458c00b07b1dc1adb3aad -:016030680bc9498522f8ad17c13f4ee4739fec -:016040406ee4e6ce07d0f4ee7b76a82d039536 -:016050e53ed66eafbb1f79e85400c8350f4ded -:016060ab36b37a26ca02abfb5a1c3bd328fe7f -:01607047d9f98460724de0feda9d695d08ae76 -:0160800d1b7935d6e8ed2534621a1b4ddff4da -:0160906b5ca6aadc33b41b2083ccccc24a551d -:0160a0ab89d7ef8f87287de389645889b2a22a -:0160b0940c40313cba41e8d1473c4e98868eb3 -:0160c0fbf37dadc31fdee5d32704b9124a7234 -:0160d0955f3c2a2cf6b7f3b33af7aa27c61716 -:0160e071c33feb64877c59a61c98a630a9062a -:0160f05c2b26b9762e9e3007ed052f91989b2f -:0161006925b08edf99723dfce1c8c85e4bb734 -:016110987c76358ddca21f2eefba876db77712 -:0161204c2f45e1988684c972d0f76f0e8bb468 -:016130d8852e4827103f8afa3ec19fb03b6438 -:01614078950b22773376d29feeba34dab4ebc1 -:01615087d060850088113f622bf8b42073d539 -:0161604bb62833860acedf60f2ceb58f4681a6 -:0161703798477b81e95ce0e07eb7277f0de190 -:0161803808af034712f99b5c928c458f5bd07c -:01619006c095ad5d85cf3f51b0cddb4ec9e12f -:0161a059f1d9be4d3347f0d992f08df54eccc7 -:0161b05c1c81854de0cd269ee5811a29e8eb90 -:0161c07dad9b8e277453dde77a99bf1f6978cc -:0161d0366a17547c282408819436c16abe074b -:0161e0a00b61497d96a72e99e63bcaec39827c -:0161f0951eb397a53a8e51d01b0224c8cec73b -:0162009d5813433bba5a4edef0c5ccb8673950 -:016210fabf70b588f70937b4fd2b02beab42b0 -:016220c66400ae39b3290e5b3eaf92fb9421f2 -:0162302f512996b4f8e1a9781698fe4fc71180 -:01624086d8f409823eb0a3b8dfaee0371a5317 -:01625003650e00c19be685821f5c07d646384a -:01626064cc71dd955a720b252b35aa77046e86 -:0162703eb166a51da9f896d22dbd6f8f9307cd -:0162801c69c31f53e93eb26182b5e2492daf8c -:016290a07818cb904f39be18cfd79f7295713f -:0162a0232825a7cba7d2c4dc1a360f781bf056 -:0162b0d8caed5de4d5ef9bbe6ec02df0aaa152 -:0162c0b65e031f887443ab9a9ec40aac119c2b -:0162d0c837728da576c0bcb198432ab984d0ad -:0162e08bad193ac4c8c6414c7c7ea61779d279 -:0162f09d1bba22f9bb0a46b7f44623c7ece3fc -:0163000528d5cd44a19d6abafabcb8a4ccc7ce -:0163102574d3c600332dd083af535fb4bc5196 -:016320a329d6513f12b379ff731930f386e432 -:016330dffa62bb48f02ed2d2bfdbdf8a44207d -:0163401ad58e822e66a894a2b450d2153ae728 -:01635024d2c438d3242e177eef5b43becc75d2 -:0163603801e5de482647c45cacbb3544e0dbc5 -:016370d5c19aae0dd331ba7b38d08a8e7c23f3 -:01638001d3fda9266aa55c68e8d6b0a0df726f -:016390fa9d616c416a5f6eabf6695926db7c54 -:0163a0e3afc3ac8e9973b885205cc956a9139e -:0163b02ea97719e8435694ef28ca2ffad2d31d -:0163c03e8d0c5f16bcb189608734690e3b51fd -:0163d08c7d68fda4ce7e14ee5d84ac55eedc06 -:0163e01ad195673630c52cc658940f72703888 -:0163f0dd037fb243df5e17613850e6dac67b34 -:016400964964fe4ec8c5e4ee77a7ac01a24012 -:016410ed13b11eaf3621e16c83bf82467b0345 -:016420a7b481b0f65f8714028ac76e997f30d2 -:01643010bfc5d6107ac255dfef9f025561c4c4 -:01644007b4f7876da9941f1d6b7ffa933e6f94 -:016450609a2e9e3a255e69bb603d57cda4ed5e -:0164608b527bd6a72d4c78e115f2f909d175a5 -:016470c25e51d6616ba432bc46980e4e7eb2ed -:016480e6175a781fe84d868ec9902c2a57bbb1 -:016490006e8a61f257d554616d84486a99ba15 -:0164a0360f2c750f0931a8cb309426af6a4969 -:0164b08163b97c54fef8f925fc30e34dfd378c -:0164c01e431bbdc4c08c0de304a98f56fe12b6 -:0164d0320c37ee678949490e9a7071657b08b6 -:0164e052d27e0742af95e0ab31b5306b9ce792 -:0164f051b1b83bee4125c8dd32ddd92899efb6 -:016500631eaf8794a61c5aac390e3f89fd8d30 -:0165105041f5dfa718a294ed12a5f2529aa112 -:016520dd0f8d79a0bc333f06ba571227c2455c -:016530f67fff1093a4121ad9f2b9ae7c9b45f6 -:0165404efa2d30ce8e185d685dd1cb9cb44a8a -:0165502c1fde3d67c7db315ee80b2bcd901f0d -:01656029e2a603d297bf4cc96acead82d44e24 -:01657054e1369b913c6ae399ed4554c488cf2a -:0165807453560a4fc9b2d4fe3271e241b786a8 -:016590d86a6316009d0f11440a371390932e1c -:0165a0a575a725db638372420007b3601d0021 -:0165b055275ae51051e422667f5de30bf614b3 -:0165c0d647e0bb3769ba27b32273418deabebe -:0165d05970b38772055413c5882ebf9fb2f766 -:0165e040b43a56e31fae1c00ce4658fac6cf7c -:0165f05420d25ecab7291d074604f5f2193928 -:016600b6a9e31b19823a3e58b7690f698889bc -:016610c85f264831a1b2aaa919c90b5f234750 -:016620061ab0c78d56c75d62ce87d923d5eb9b -:016630622b8fdd1e5c5ca56e82dd9e60baee9f -:016640a1b6cedb8fad4b8495173d200a83c5da -:016650949815e9323c70b0ffd626b5d70d237b -:0166605a76706a834f27fa3a3e4168f3343848 -:0166708ea1a064e81e0a8eeaa2485320f3dab8 -:01668040e17bdb66e907b890682c0a0e720c2d -:016690c7497a5756e3dae335b67fde4c505b39 -:0166a02484ff115299a3a19b8a17ff2632c5a4 -:0166b0f6f5554c0b2637819dbb296f61507555 -:0166c085fca7f682330c8446914c70a4773819 -:0166d0881c843ba8b5fa5cfe46230a3e82ee00 -:0166e0bfb1adf8ae0dc1b3e100ca209b7c4e3a -:0166f05e7c00b303b9cd7759c204e760d785a1 -:016700a535d3e4e105979f7f67e2b604f9b401 -:01671087b0a575d228608a8fc15222f08adc01 -:016720ce09892bf49179371270028b16c7411f -:016730a1bd899a788db25bdf97e1364126cd32 -:016740e0845bc2121b12d636e0aa84ecb4f634 -:01675047b5283b2a7387171f96717600d187d9 -:0167600fa99d59d76601d27118317be9507f2c -:0167704247964f604ca0ba84297b13437690e8 -:016780c07c097b5d0dcf50b79cf01fb5eee4a0 -:016790d367f77a8564e59b85ee095277e663fd -:0167a0a0a75d658411c7ec7d0af6aaa06604db -:0167b05c691fa6ca2bf06d50ecbde3a0a2413c -:0167c0d7865b99264ea21b5968f4feae8df834 -:0167d09ec5a8091fc36996ca5bc926c37a75ab -:0167e0dc7b3354198a9681894761783c791c5d -:0167f0ca80f27ac9f0f7843d76c953b06264c1 -:016800e28b23af76887848601798e5ecfafeba -:016810f1a989fa1bea1475a82d0a73bf5eca3a -:0168205c2da5550e9f3fc3d36de1fe65ac44c3 -:01683073edbbaa194e8ba2bf6da0de6557cd34 -:0168401668bd329080e884ceea26662508ce6b -:0168505601572541d6eca528909ea168567fd6 -:016860dd1db7ce456d7b16a60182a8f98ee10a -:01687022a94dc17232ef39ab15ec938e98985b -:0168808d22e7563896261b832b9f795ca2d8c4 -:01689075a3f6e2b3d13f8fba24f94223b1a849 -:0168a0176aeb7ef7d3946fb5bce74ffa9dd601 -:0168b018ef6fdeafcc73448df4d8899f2189e8 -:0168c0cbd9b7656c7a0fd357cdc3a107e250bf -:0168d0d5e9f9adc0d40711ea5f66532a8732a1 -:0168e0a3b180cb957efb08344d2c1c9a94c602 -:0168f08480233331ad5575b7fb6e607de53c79 -:01690060ca0bc55fd21f1e0dd7f33fe151bd96 -:0169100783c3f54a498764e1c1b27fa916e713 -:0169208564923f200422c03d74ccc04bf8e2bf -:01693054be7b9bff0f4db842cbe2a99fadf811 -:016940650133d6fd798aad4142041e79764ee2 -:016950a7af0a428649a1d121403edbf6d2f511 -:016960bd71ee83a9a75f382aeb094acd2491fb -:016970a464163e44109137540926964dd1093b -:0169804979d17d78b4dcc2deca24409eb41e6b -:016990810b80eb30ae4c45396e6a4b05f94bb8 -:0169a0c6c9da197975daa7706b642eeb86fc55 -:0169b08cd15d03d774db968b7aaeca741049db -:0169c067370880426be209f41470fd05efe610 -:0169d0370bf65e8992cc4891f6260dc829572b -:0169e07d9cb9b8194f03fe73f9ce8e06b62cf7 -:0169f0329a89e29010e8b43c4014f65bc1e7e4 -:016a00232da772420444657b3a5f97fe0877bc -:016a1065cd06c5d4e7f333a64874733bce77da -:016a203ed9d485f499adc2b9984d3f7423e4bf -:016a30c519b5e602589abc5d163e2bd9b434b5 -:016a40b232929822e941041e0e085c03cf3ec8 -:016a50b4b4c30b990ba16faa2dfcb1d8504afc -:016a6023b8aa50ebeee37247d7fee9df72dd97 -:016a70fabe64cf4e3898ad024665d5207043d5 -:016a8024d08e46f3b8a3cfc81f8f5e0a7ea0c8 -:016a904368f50762ac17a942114de74908830c -:016aa01bea7bd9cfed9f66ee40f910fbc17d9a -:016ab07ba3651f3f55946c0869e5ff890b4d16 -:016ac048bf1692e20f02dc76b21a3485eb4ea7 -:016ad09745f6d5f19a6b30d4402106ce5f575d -:016ae088314d1368b9a726f9eb5eb2257274f9 -:016af04d00e69952ea02e4914a45c64f04a837 -:016b005995d473cb52f424192888f47f06c635 -:016b10dde47f236aafa18b6820cef1c2198e0c -:016b20638e23beb23cc11033abda080471b4ac -:016b30e997179b2310134832673f5cc98a5d26 -:016b40c4daee75cebd7c1152baa1c5f19d99b5 -:016b50c14685f2296bcf5d0e0d7005ca86bba0 -:016b60c60e5e975ffbb91bffedbbd0bc3f9c12 -:016b707803b1015a08d9791e84d297884f272e -:016b80442f246944fa0cdc01403fb098232e45 -:016b909bc492dd79822c2b10b6796bb98c6676 -:016ba0cd40de07211b8a04f1dfbc93baff730d -:016bb0617bafee236d51897ad7542c9df66100 -:016bc0ff0058553b8257e53602a69ab039bbc6 -:016bd0c9c6d6ff378181ee1230c1108fc40421 -:016be06ecabafcc6b0b5c929e6a0c1b4785586 -:016bf0bd17bab80cbc276e1619e14a4ad56f39 -:016c0000d70e7d27b293bf5a80a53166c7d940 -:016c107a12b36a227199dac02dc5fe8aa895b0 -:016c20e8e38642f21d493b7e072b6fbe4a1a19 -:016c30642aed336103025a67d0fcec298d08f4 -:016c4061eeacae1897c659b18327f4c8f4fb9e -:016c50a2e63e92c47bc56ca4ce176ce04cebbe -:016c60d47efe7d9c1c9f03137ad0f853bd6a64 -:016c70f1c26e3d8a7db33f73a97f32aab1fc5e -:016c80dedd88d2535f4a836b4b94e25626ddc8 -:016c90bab8f9f6f4f0c54af5ecdcf55ed205fe -:016ca0fa8be3463d778986b5ae91c90f267f19 -:016cb00d660fc59c5496d92b45766663db9cc4 -:016cc03d7f7b5beb434fd51e08b1d375adbb94 -:016cd0b7522a6591665d90853ba9461c51bc35 -:016ce0aba1fb8a2116bef7d7ba49d838f625f9 -:016cf0203e16935a7b098d3564f6a97a370ebe -:016d00061a7de4bdb606384ccc163ac89994ba -:016d10bb39d7562558cf8d743a1daed27f0b0d -:016d206640ec933f8c413a52c664483e802c36 -:016d30f2758b1593868d481a6905483e274743 -:016d40177c5ca09376e5c569271e4849a13ac9 -:016d5043683428521e14a985da9d9681a2b7f7 -:016d60f86cdc9f2a4a46bb8d86a7e1dc989ab4 -:016d707b75fa63981482e75f20ba5aa31f74b4 -:016d80419d38b6bbadd53392ecb9ab02d4c4d0 -:016d90523f1df6072e463cd14d3a274b1fb923 -:016da08da90bb178d2821edb6f7fc96209dc81 -:016db015157bfa825309010a1486a2d5be4386 -:016dc09f354cf7fd8ff0d823e43e63b884e05e -:016dd02bed61140bf7e2c26c149ab9c9d36195 -:016de0e7617a7d22da3972c0eee9f7a1d1ae1f -:016df04d95899205207728466be6d72859c05b -:016e00ffb974eff79af8aaa22009a156c83856 -:016e1001088835f6148b721576af08fc311e0c -:016e200a8b1ef20c04c7774283a0dc3aa79714 -:016e3070d168c4364d7d005d99b7f0d4a5b55e -:016e40f458d7b16d95e691ffa05719b1a1c311 -:016e50e1c7c622cc78eedb207ab3a65e47c7cf -:016e60d83e07536148f9ffa1fddf53de2ea786 -:016e7097c68cbaefbe3cfcf03dc2b754fb58f5 -:016e80156f99dbe79cbd80b67bbd2a833cceac -:016e90fccf94020366f82708628e9c8e9d679f -:016ea0c334746d7a696b2a9bf3112e9909ef5e -:016eb08d96a9a7452106829f6b5247c799884d -:016ec05fbaae81e3a99c4ece214b3111e0d7d6 -:016ed01d1952ee5099b6db4a7252abd3293a3d -:016ee0e8acd4b11eeb16a85db1362df132e300 -:016ef0f2c5394a515895d2e7a8eb366e5bc165 -:016f0051c5300858a3f247baefee10c3fb6bd4 -:016f10c17b0f429d9e37c4ef6863c45bafbc55 -:016f20d5976fc347e123e271e1bdfc4e010cc5 -:016f30ce5b4d3125db8996d536f54c5c199a36 -:016f405671ef90538495fc5e498a43333d7e87 -:016f5003648c1abd9eb23c99169fbfaff2fdf8 -:016f60d433aebdba5afa316f833d6068b60404 -:016f705577c443705d8c71ef2b713e17463d1d -:016f8027ea2b177f887c8548b859b451512163 -:016f90135ff2cb6ce3dcf8424fbfb242aa8ad7 -:016fa02f6fc23442a003944b1dede08bd3e19f -:016fb0940859194fa204443a946309150bdc09 -:016fc053958967b2d58891d9bc68d20998f66e -:016fd095c9d472e525bbdcdb8ec59b48e36277 -:016fe0d572949d52fb7e11668048376593ac82 -:016ff0218a1bdf3a0fb7b25c945e27b1bda918 -:0170001ce1d17d53b45957e5b51d01e1b181dd -:017010a12fee93d94071bfcdce439fee7bcf80 -:0170206df66b0aeebbf6120ae6d624e9fd5c18 -:017030b1f08fdb889e63114782aa7a0dab40f7 -:017040ecc4d0f490abd4712e41e65eeb34766e -:0170502d4de2e156d2628bb2023b1746b718bf -:01706009f988104563941e8101880419dd46a8 -:01707051c0aac46dafaabe5922fb4058561c33 -:017080992b279280e9723b049a67a3ae08cd5a -:017090c87f29dc3c45e8ef921d39619272e346 -:0170a0e64eed7159022b6e10951f2e583dfad5 -:0170b0d887c0b2757b836ee4a6d438723b1aea -:0170c0647ad1018d49a62e8f8161e8f166be5f -:0170d0e6243900e52b33fc2c6cdd48eb1a64b2 -:0170e0f284d7a8f5b3bfa0991a1daf2a1a45af -:0170f0b0ee846e1f8deda83aca185b2d6069e6 -:01710062229043c898df34b06e55668fb5610c -:0171106fab6e7d6ccbd6b4f2e2e0e26240bac0 -:017120f71c2c50ac2e3dad67d3947c4bf05bb7 -:017130cd53b253fb9d76e9b8200c711e3b5df6 -:0171402a5649fc39310ad4f7b49d7b194c3417 -:017150f45c155988b68e1afa23467bdfe73d3b -:0171605e268adc872b6c8659376729df1968bc -:017170a3761c99690f0003ea8fa71f0fffd863 -:017180a8be9fb28687ea1285fbe10b1b19e76b -:017190a9c776a9a9aa977afc3842d1d178e6d0 -:0171a001375913dec66e6a626205da4976ec0e -:0171b08c0010ebb43a4d4e07f79faf145f6a36 -:0171c08fa52d9d68da3d358fa07f3ddb849608 -:0171d086ea83e01186ce0c670793b6d2728cf8 -:0171e082906fc7c13403489f3bc7ada0a04ea9 -:0171f0ce9557dbffc3c97fef4d256a996c3918 -:01720025344415f287b15112e4c874258951b1 -:0172101c5f287ae5d693e1bf621cd217086813 -:017220592ccf41320643d1fa4fc0a278dd7f85 -:017230ad8809eccdb7e6a8f16a10b0ceb255ff -:017240dade98655c3ed997b07915a5085384e6 -:01725051651fb473ea3eed561024b064fc76cf -:01726091994c1251ae7662067006d3004f4fc6 -:017270d396cf9a0081fcd08bae7ee34b76064b -:017280687f7727fcba83f0c97bdc63b4bf5575 -:0172906fe639439aa48e01f0dcdf73f2e9fa9c -:0172a0f8f1b86088d7040689d809e847427108 -:0172b06dcb92603b8dd37ccaf85ff2a8f8d0ca -:0172c07ef1160eff12079259a02e3bab436133 -:0172d03364463c53997e78b9c23fbdbbce09f2 -:0172e0b1747faf0ae8286408a4c8b108b6b857 -:0172f00225e51b29b384f2ca5c2cc0f3613438 -:017300f1c69e9c90edb6f8975ef2d8930fd1d1 -:0173109b9e344762a2b32aa41d73d1447bf971 -:017320f5b0738e04a5dc928ac953f974227075 -:017330a4c0c976b19d6a2eac32f79d05705e5b -:017340c2d95f85b8b83735f6cc28f31419b306 -:017350f192f3ba56dfae3e406c19f9f53164fc -:01736085afdc9c9526175e513bcdc5fc17d29a -:017370e45c76bd2b4d82bfb94a5e233920dca5 -:017380ebf7cb3505d5428c886d08777ce85c70 -:017390bb738f6b40ced48a2e5e530eb8f9ba8e -:0173a0b242dcb85925282b698075d1dd9cf151 -:0173b07bc234c4f905b8bfd555e804315e543f -:0173c020ac77c3bff5f2342e512e3c31ba5806 -:0173d03f06a8bb65afde53492a805adb793eed -:0173e0fee95310d39029d3397ae99670acd3e0 -:0173f0ec0436be7e74fb96bb2122c8568cf971 -:017400d9f6457755c542f71632b82604fa88ca -:017410d56d42084dc27cf459f6920cbae642a1 -:017420f705d74e8f1856d44e000e6a22dc5137 -:017430917178eaa8c8e383138de18f1a661126 -:0174409d38c5d906b98b0d72201dd05f95f7d4 -:0174504d8acfa2e723c0d37a906d9f95946aa1 -:01746051de45414ba84348982947cb450fc774 -:01747061c4a6c54f1fb022f6ec253bd0ca7904 -:01748080e1a9449e7c2c7d3ab6280085c08203 -:0174908b14cd9b0119aeab5286fafbf6255fb9 -:0174a0cb2b3fd9ac01c2bc8c707c251f6ea0eb -:0174b07a72655a66dfd67cd331b2d50779cf47 -:0174c0a5947ac2c773674b43ac327a872b68dd -:0174d03bb7f2a95a6b490183d1c367682b1e8f -:0174e0092d39f86f4631581d3954cde580f85b -:0174f07096b337cc4bf923f1690363d97da810 -:0175003066763e6db54d5f0bf3cc886a7cea5e -:01751049e621b2414564941bba3bac8515c365 -:017520b177d8e6586aae07c0aaa23f07e4d14a -:01753041fb4e3817d79e3ef6222ed339e7ae3e -:017540ed5d74503989aeba9c039c995ca46a93 -:0175502660fddcf50565a4747deef11c084336 -:017560221ee4035b2e00ee6397177b8b2d4aad -:01757072ef526bd4969b5f8c7e794251a58228 -:017580bf8ea085fea768575d6a7528480f6cf2 -:017590b541928e0e912bee17f1e7c10cb3447f -:0175a05e6d5dcaffc73b81e62aeac44bdb91ee -:0175b00fc59e1de782e9bce372faf12dc1c2f6 -:0175c040baa62d3cf756ab7fa06f9ca62b214e -:0175d073f4075b47b74ef1793901e442d7ea00 -:0175e081edea76b70a65415f3b6d4bae11ea9e -:0175f039a08cdc54e4eb5159124bae88f8a74a -:017600030f09cb85b691eae060f42bce79f3b8 -:0176101050945a9dea9c179c73f7712b2cd027 -:017620a2ff6d1a48c7952ac1edc3a2a5e04cad -:017630455b3257d81b0d601ad5ad50c7c0c6af -:0176406a8d56f79541b84c8d86e50f4a0e501a -:017650aabcfb310adeb28be41f450c03412a11 -:01766069e7be6ce86914709bb69da70ebf7071 -:017670b5580fa4c6230213f933fe9535f130d8 -:01768042ceaf53c66d71e7c90c18bff9d0e319 -:017690dbf859f6eb14f8b0acda13e8236b063b -:0176a04c0da0e911815fadc7592f6509de4d7a -:0176b073c81879c2c17f7edbdce41bc75282bd -:0176c095735f955d0d0e895af8d17dfdfc6d88 -:0176d007ea78b52bf5414f70f0565b274d206a -:0176e0985d5b2d4813472f31e7ce95b4d1f1c0 -:0176f0729b3e155b7ec368f09227691052697d -:017700824340811069ec3e0ceec7822e840d02 -:0177108a889c0757cb78fc819757a90091338f -:017720764b83b548280abfcbb90dbd52ae5fb0 -:017730a7ab46603fbfc261fa2e00b897b4d5e7 -:017740542e486a6fec7fe5c489a365fe0e2add -:0177502da9ea0ba5309aa7329ad89a39a5c466 -:017760b8664a60eb7608b5a0e5022b703fdf4c -:017770cf82f024dec23428cb94db40700d3de9 -:017780e8b4db3fa49eacceb6e0165cf35af6fd -:017790326d89097bd96e4c73929676afc6c611 -:0177a0cc7e9a217fe286817684473798bf788c -:0177b04a3427ac2e5daf49646f1cfd2db63fd9 -:0177c08cdad05916a51200450d90cd0f1df7e4 -:0177d098e78579bcc148fb231ba964f374a491 -:0177e090ea351f77e8b71d418847b175b53e94 -:0177f04b2cc65b72f91fe0c4240795bb866506 -:017800473879064638e4293e5434d44aa0229e -:0178101030881dd56ed1d07446e9f2861ee559 -:0178203319d359e1aede8c70871207c48991f6 -:0178300cefaaea116dc32f12665627a591f2ce -:017840b162347c44e0d7d1db65c30c0a9e8df8 -:017850b67cc66f6beff555550c282e867b5847 -:0178605c69f589312620da6c2acc9d84bd4791 -:0178709415913f1408f634667cb87989b77beb -:01788096fe1f4b88d18a2101c23e385ffbad99 -:017890e962085cae8e471da601682657089e4c -:0178a01db58945faa3ec7115db991ff8b33627 -:0178b08d778443b178b300a1bedae7349c07ef -:0178c0e21eb8f9661d5a41aa9476b6f1423bc9 -:0178d0488a6eea6875dce53159d67df75a8b42 -:0178e09a9613b1a7739a920d59773aa2d3522e -:0178f031861039c91bf02fe9bfed2c39761c00 -:0179001400951875b539b301af623c420dbe2d -:017910e6f936a1e02bf521e86201f4d933c2e4 -:017920d197c437e4748fa917235a20a7900f34 -:017930393e271abe3406d517423b8465326d35 -:017940294df3cc4242ea0eadd523c156a3e0ff -:017950f04d795acdbdd662a4479804978aa086 -:0179600c8e61d55a1792b30793d5a276323aba -:017970196e6d915da9ad1fb24a617825c5a539 -:017980dfcd38a46170cec8455840c032e42d29 -:01799071e8ca8a7cd8b11464d8358956540ae3 -:0179a06c29c2280962a27ab5c4175a90a2b9e9 -:0179b0fa0605fa1c442d146e9aa88a918ec2ab -:0179c063dcdc70764ed2d56f3718f30f1c63c0 -:0179d0588e7769f6d05e066f9846ba5d5487f6 -:0179e06a1083323ad8be7466a467675e6c5395 -:0179f0126997e45c42025e995e287c9df7a946 -:017a005c78f0d4327f74944806682e42c40e94 -:017a102d3519f769b3b38872174efa689a198c -:017a20fcc6548b8de620f8608127d818daa9f9 -:017a3090ef43c45134391b92f501f11ba85121 -:017a4086b613e78098ab7c4deb4d0b918df363 -:017a5032621f0f7ec226f4c81fd9e01131802b -:017a6007aa3d26999e015fa5f1a88524ef303b -:017a70505e906a0b8325023473d2d3e4160042 -:017a80f38401280debd6e8b4b8b5fd24291793 -:017a90aa9aab17f6dd7e92365668347791c02a -:017aa049cb56adf59797e4565b06e57c7d489a -:017ab0ef9974e9cbc03c6d761fe7226ec4133e -:017ac0cda5e49d99f648a017c10b5f809ec65b -:017ad0a9cf508be155b5fdd3af24391df42974 -:017ae00c79574dabeaa82abd986ec6b4398e76 -:017af06f0674ffa19f43fa136b2018140f0f5b -:017b00f7ed812bef346a9bb30d2255d8a8302f -:017b10502e21084247223460ab007da5b58edb -:017b204e6aa4ddad89177d9da4f7aebddc9d2e -:017b30bffe3b6737037d6597aab06145859d7b -:017b40e5472c553d44bc7a342b3951a0d09021 -:017b50377f21d13b4993a9dd193551b562f87d -:017b60f7e703d6145c0ebe27c82010ca26b7fd -:017b70e6a3f7e328eee6a8cad8db3481e2f968 -:017b80346bd401563b06d63a9b6d1699611d16 -:017b90025c5d1031ee42d500cbe0aae4b1daf4 -:017ba0e2cbd2c3b9101690e9a8e7dab087ccd4 -:017bb07b54dd86ffbd6ede083aadc8ec467260 -:017bc02fb82c7172fc8210d15c3b3b81d30cf3 -:017bd0dc80a5153821ba615fac4a8412325913 -:017be03d0616bf518c66e751d5469cb8ab787f -:017bf01cdbafb22c8450b74cf57ad17796a617 -:017c0069aaeed903a44110463ae3669d9b094b -:017c10a495695b984b3ab12e1de6d482f1ab1f -:017c20e0c74030fa5da72b4b85834c9fe815cd -:017c3072095c68f5d2ada3a89a5e20a872904e -:017c401be2c0bc35178da781e1ed12fcd2cbca -:017c50174da8399e6265e4d4c93b77bb75b89b -:017c6040b089685a99fce9457be77736a4d0fa -:017c705752eeaeb120fd0bae11f403b09ad780 -:017c8092ef9ba991cfdbc67562d937009ba070 -:017c9012996ad8c0d58bd1afb1ddd8b38343b7 -:017ca08758bd8f01cf627b2186f63878d7db28 -:017cb04779f629beb9b29660ae71edd7a0eab6 -:017cc02f5fb11601e045853aeb1156b08e880f -:017cd06a570f879d1b68f5b7d75cc93383e704 -:017ce0b616c02b67ddd38d7326075413f30ce7 -:017cf019e8431ec59ca641c125a5bf67eb4d3b -:017d00604edefb323f0888712dcd3f6c6a11e7 -:017d100a30e8bc0b26724c1a9dcb9825e7b684 -:017d20108c0785d75e6e1894034715221be397 -:017d3032661fc2452247a2e5f365351fd94220 -:017d404a945534265b0af92773e5cb70a7b518 -:017d504edb99367553f68493ae484010b6beef -:017d60778f4d8c76c99d68d089ca8b1e889483 -:017d705f86b9fbc889fdbff34197c029d9406d -:017d803ac75dfb315ff77bc312e474e2042e26 -:017d900893a50e859eb4a299dfc5569a6dee93 -:017da0f59e5b10dd5e5436e9d8b7cccbeb5aa2 -:017db016ae60403b87e3a9356f7e4297b919c0 -:017dc0fca0586535216dc73d8dcddb9d80510c -:017dd07f8c8260552e707325a625564fa6c17b -:017de0288632d6aa5d93958313eabdf4b2201b -:017df0ac3109905d74510edcb9f7f0312b8abe -:017e0022a50710fde8f1aab89006a5d2b58204 -:017e10508cf24ea5a7e94ab974b0ae992e86a8 -:017e203e7165adea47b24a1c3b316dd50804cf -:017e30d8de3ee33fd20dbaa078e299d0ca3ebf -:017e40002e1cad44cef9c8360a36a3285bb81e -:017e5032b20e511006add96dded376d0c0d0c0 -:017e601e95cb1888c5f4062b9ed265c80b09ce -:017e707d7a751362c3eedf79c71d854d81364d -:017e80fae40102aa49703fc8e7c1f70a090c6e -:017e905a6da4fa7a0278b01f61fb35f7d61264 -:017ea08d318fc7d259d793cca7807a8c8c5192 -:017eb0d160d63eb71e1834feacd84b8a104535 -:017ec0fc838f25936be0b9e07cfa45e96c6552 -:017ed0c17201d2539cd76cdec715dd426a8e7d -:017ee0301f632964326701654a0467b07baa56 -:017ef0eca29ea42135659faf091ee9fabe4820 -:017f006345f4f542ece070070d1584d3e4547d -:017f10951377e8f91716710ec616bfb132a515 -:017f203fb15b63ad7d64a873aca2a0a7e1f56f -:017f30a8b33ba83de8543d840f90316311721e -:017f409a1e81dbd88721a88a657212afc7c03b -:017f50d6ab606c61de6f01040ef444f676909b -:017f60a4283cdf0057f8718882907985b0354d -:017f702fea248e754e512287527b3b2dbc2775 -:017f80ebd0746547d32a21f3436cc120dd693b -:017f90dda1480b5c26dc3f54001a229ab716b9 -:017fa0d9df5889de4921d56876c7be5f2cc65a -:017fb00df4efe77c9dbc389a376ae7c27ef55a -:017fc03c7f4f8f62a98844762268d1f8fe0d62 -:017fd0956a10b143e27b771b3a5ef5b8a10d10 -:017fe01f37daf4ca58dfac4b87d17ad486902f -:017ff0aade9f6f9ff92659f45163b1fb03f05f -:018000be86870f727121e53da8f7ce0e796cfe -:018010cd0de9ff5b2070c5719eef4645431d6a -:018020ea36a940ba6016b8ad5b1fa676d01c29 -:01803061efda49f70ddce32fd1095d733948b5 -:018040b350ca11404c3acff54e982b6d109c35 -:018050764a0e2dd67bce2f888f8ab7add64469 -:01806002d680d1e672c7234607d27564900942 -:0180707ce63327920b280a115b6d74b6167d47 -:01808073c8e9c33faae7783d0f078c34d99add -:0180909f9cf4e39334440104bfd350e47aa49a -:0180a0d774b6a308efdf35509702e88b661930 -:0180b0179036d817fc019c7aa772039d3d4f03 -:0180c039a5723519259f12003f217aaabebf3e -:0180d01adf337030962c240f5ca01c5362a308 -:0180e0f987875e8e0ada18764d09b8ed4a8e6e -:0180f0cd2b724cb1a49cf840855b496286fe1b -:018100a69efc3a791cf7c5f6478c17afb84dfb -:01811014f90a611fa48743a54887dc864f2d13 -:0181200abdd264e1ee0868dc89ce1dee478840 -:01813036ec6e27d2048de5218a267e8be16b93 -:018140fd759791d1d9c826112211578a873a1f -:0181508c97f4e95b8d97112148d00d9b6e00fe -:018160f50f3401245f9965954863e3710e4c01 -:01817002cf451ec5091220d1e2b6ed2d01a7f2 -:018180fe7a3f9e621a138f4c5fe582d829bef3 -:0181907a0e2a62e0d6fbcfdb19dea03df70fd9 -:0181a04d8b24c38815d32f744995b627019b1a -:0181b01bf3121da5011fd18212f101dc880538 -:0181c0158519cf4347e27f33352a743512cb1a -:0181d04f1fdc8968a820bd072655ab6f95a6dc -:0181e048be8cce95082b1e9fc4b9511fd298be -:0181f0a1d1e255d175e0ef467d4628647a4bd1 -:0182007285829ffb49334e5f749359c058174b -:01821041604d7fd0fe8d2be56f6b9392333364 -:0182200d1eb92401ec764b2fe9d6d104992153 -:018230607912e3d2900a51733929b746a4303f -:0182408948b88fc3006cfdc15bd3032933253f -:01825044ad19ee286d7ed9a8e934187adb3a45 -:01826080c6cf66517666cc8245ef5c41c861c1 -:018270bc3bdc35e4e649a005e4e15a9b7ddb7c -:01828083af1768062755953c06171d0a5bf470 -:0182905096e8bb3372b30e30dae9dbdea195f6 -:0182a0907e17423418b6e095b5ec1e95368828 -:0182b04276b194cf9376585f049832af389f2a -:0182c01a1987db16da4b0121325a8935eee6b5 -:0182d0558aa7bb5769cc9248ce47b2d42513a3 -:0182e0a852151b2e9f6285a5f196cd8d52862b -:0182f0313ef3f5435e30bff9bfe02bbcb9cb8b -:0183003f73b04b0937346b825019645fc95fb2 -:018310594c889c4280089a22e4e516716ee99a -:0183201bba03d7759bb674f99f67104acf37e2 -:0183301afbfea1694c9eb5e8b12777d0fb393b -:018340c3fbab4ba0d79800ca1dea1e196263ed -:018350f440ada21ea419ee69feb39e5ab4e5cc -:0183603b6dbc509b7e28e842f21f7b0ecc19e2 -:01837018ae923ec8653cc652a1546bdd274bff -:0183805124bd8e2e3234df31aa4200f050dab7 -:01839021a2a048eabeb875a272eda7bb239067 -:0183a02d77cb885af536709ae341ce80eac7b7 -:0183b055e7c54b34b2845989eee537026927bf -:0183c0f91ec77241d5719deb6d4e301184574e -:0183d000d124fcec0413f9999a9525f83f1d55 -:0183e0faff576b2db6e2b83ccc7e07d12d11b8 -:0183f075debf260dbdceee65827d9bd6f66210 -:018400478e2b2dd877c553cebed51ceb6bbb26 -:0184106128ca597630caea630e98736f90453d -:0184208514ff54c5f43deceafd4cb9b85e03e3 -:01843089eb58e81944ccca4905aab619393f07 -:018440e32ab81aaf70c71517f0aca1ab40f2e8 -:01845027b4e039c56307fb45d30dff970fcdf3 -:018460460ea3a20b38376a371867c465d14ba5 -:018470823c6100d0cca1cfd03b70387f8f54e6 -:01848068e066a5a1e5bc9b6d7b3d6b3dc2a53a -:018490a2276dd4cbaca8c4a59dbc17deb3e8fb -:0184a0bd1ceffca86aab8fcbb7be2d4e7f8884 -:0184b0b1cc377b243d16eeff701a7deb35abe7 -:0184c0d42de32c6cbd22ca11d436475e379128 -:0184d0726cfb0c979a916d241e57a652a86604 -:0184e0606bb4fc552b2818bd2ab7d9a4ca8ac5 -:0184f083a4d9628da4cf6ca344b47a148bab46 -:0185003b22e130a94ac1ad03c4548e83db0692 -:01851092337589dfb4656e3644ce27f2f7cc33 -:018520d5113fb08c2bb8ef98314d3f696c0ca7 -:018530a3b2c3f9ca85948115ba79cde93d0f8e -:0185403100042e829d97a92bc005321b24a361 -:018550ebd7e89e5b48a572576eec308f26a9e7 -:0185607b32bac3b01c24ea71601fc3ca61cce0 -:018570185f66fcad5a301b5ce95c522d648135 -:018580ed2a9030edb17a5604c9235a42b8ff44 -:0185901f4e74836b30f328eafcbd42ec6bb6aa -:0185a09084e93b9d8cdfe263f27ebeda48b0b5 -:0185b0653afe1b6bcb79ac000eea5291e558c5 -:0185c0c0744a04b1588e40d5287fe73387586c -:0185d09371b22a3ca61b15473030fac94c23c7 -:0185e0d4c4907917f2636e6cef76ce0363be2e -:0185f0d4fe6409e03619f9820eed8f9d857a7a -:0186007325a3bdaa468b976529512f3236c434 -:018610bc124b1b9491ad7c3c29a09017a5333b -:0186205d7a661bccbe88b2bb3bdefab6475fcf -:018630678e6d0ab79e2df42ec74c6ac505a19b -:018640876c7dc60832afc0c395f9c3405379aa -:01865085cdaf26bcdd9e7c790a7efd2c9dfb04 -:018660e9993defdcd85075c836980d5aa9889f -:01867083dbee78e3748ed1fd5b6bfa29027a1d -:018680a4c182061c5152a185ce8f66ffe61e94 -:01869003c60ca23fa80f62b3a609d32eb656dc -:0186a086aedd4cba17c81b438804d943a41560 -:0186b0fd891b2766066fe0aca6d7ef3094936a -:0186c0ae4dda3c837250d517d458391b3a8701 -:0186d05db1dd33cee31bfcd8be58f76b7bbd8d -:0186e0c978fd6f00b42570da19b76d123dd6cb -:0186f0cfe9fe73cf63727a8b1e6468699170d9 -:018700a076d3f75b5362e4141953722ff917bc -:0187103f46ac1a5942583925c39ac01835090d -:01872000dda0c2960b0c6818c830beb570ed85 -:018730c48ffbb017a2756863e372c4b0056e5b -:0187400c0b5aea8f58be0729f07ea73c87d83f -:01875095aab0b475ee19deee6ff83541bd74fa -:01876073ac86436dff542d5f2918396df81994 -:0187703e203993f225c54eb46cf8f7906375ec -:018780f78c10c0e5d123ab3839bdd5d562ddd9 -:018790b197cd1e932152aa9bf0fe1e24eb9661 -:0187a0343a10464ef4fde14c4f18a50829fec9 -:0187b095d052d79a44be19811ba3ba9a1353d4 -:0187c05142413f5fd8139d8aa35772547b8d85 -:0187d011344f9fe44d44666bb29f5c1eaae850 -:0187e0038a3076ba812cb62459c43bb422ab55 -:0187f03ebcdb06e469b66cb780259618d10aae -:0188009752bebe707952735a0d58785b260359 -:018810f82aae7dcaeb20fd9c4520690b1add27 -:0188203324f1ee7cfdd5003e6e4a6de60cd190 -:0188303cc9a7418d9a5d54109e669234a2f81c -:018840e251051bb990cb879c8ce13933805fab -:0188502dfd263f38ef9d9a1b981be91df25509 -:0188601fafcca1b629029bbd13d0edc23e1d19 -:01887082d7730a328ab5aff911def886de261b -:018880513c2d4dc99d7696366d2bdd789a90cf -:018890ec51af6423087ca609dfe124219fbad5 -:0188a07c756896f35d17b4d79b57f6e38e9833 -:0188b0ed0c0114d87cb868c7003a5369ee92a8 -:0188c00ce1e392277ae5f48e00633c8e206c24 -:0188d0fcb966b2043d378ce632ce8176a4af78 -:0188e09b31145223fdc69dc834028bfc54a300 -:0188f09c65d791c37a9833c00d71989d98b5c3 -:018900b2129ad6cc8b4cbbec61b7d9b74e6201 -:01891078ef0b0fc9f666a00129c4727d4f56b4 -:01892061b2c395929466edae4761403a425217 -:0189303a197553bfe76b39b84bf2d7507a4755 -:018940a07e8b3bab90233cae9f1301b8f7f2c8 -:0189505268066b284f5c634235dd4120ae9280 -:018960b8dab3ef23b890993fa52ec6971e833d -:018970e2363a7dc6dd3f93bf6f0d01fd583d61 -:018980ff5c9120ccf935536ce0cfa0e4ee846b -:01899069f335d030b8077c6dc29e049b033a27 -:0189a0825311c37aae46f933676023795a6d60 -:0189b0f093b8efcdd0065d9c450de93b966a24 -:0189c0515442442c7759c73d2f8fdcd8d7d095 -:0189d00409e6a7aec8496093ffd420a4a74ac8 -:0189e057e34c6222b17c117b712f0fcfaf9118 -:0189f0e8f2164902507b015c5f621d147be4ac -:018a00b78a2e754fd6c003e545c9a1ee5d7fc7 -:018a1020f57714d61289daaa5f588fb7739945 -:018a206e6f4dc1b09e12d2bd72c77936c095b6 -:018a30c4a5f5dc5d51e735c6bbf1446cf003f2 -:018a4072c0d4ecdb3bc716f167d03d5b2cd402 -:018a5076115c381cea45568c7a41abfe2cf21d -:018a60a847be1cbf075be845be20d84aa4eb68 -:018a70c2abb914f8b5908cb7308d97d029c7a7 -:018a80abb17882cd4346af4b326db2bb7d6815 -:018a90419f9b894d271cad984332d4db96e51d -:018aa0a177df08ec3842a718f0dc2aee9fffb3 -:018ab0bec81187d1fc17e0c234b0ec1a770c03 -:018ac058f6ee391c453c02d560fb13b95a6fef -:018ad0229bb8caab4a73e6f35e8415efe4371a -:018ae0b75a205397f9bb5a443e4ebff82208d4 -:018af0c0f8d9ddb48aa66f3a0ebc640762f906 -:018b00d6f074df9bbb0ffc5d7667bdfa0d3cf0 -:018b10c33bfb3819bac60f977709a9cd3ca3d6 -:018b2086a642e5ea3790d4a36694e352ee478c -:018b30bf463e97d0c08664ef107987c36ea44b -:018b40c8100411dffb19efc15e9bc437e22bc8 -:018b5061264b916c04f3c69a34286f09c200a2 -:018b6006b6ff338fd019141ea929a9cf8ab032 -:018b70ddb5b98cb7352f58f973f5ce9b4b075e -:018b808bc8b0bffa6419cd6c0e001d9fced124 -:018b9044c26bc7a917420b44b4499e6a4faa22 -:018ba04cefae07d21c34fd190757c76accc50e -:018bb0070de2a89d179a301e0187ce353f13a5 -:018bc044419998f29b38e2ae6bc9c60281e5be -:018bd07ba48c769f697921449451ec107be0fc -:018be0cff10ebaba4f81a630cb7fbf69f41d80 -:018bf0a8c7a2e88b71a1bcdd37e389b44aa222 -:018c001516122aa4925d48d94a536c313af2f8 -:018c101ec4fcef97897851401fc7cde23e48ae -:018c2085942230379bb5eddc03f52b14dd87fe -:018c30d0af3c82d6a5c361c5e4c34f5100db6b -:018c40eeda540d2f7c0276a1e3780b27551426 -:018c500aaf235317af65c3f85a7d14ca0829cd -:018c60786b736b3a1412d12596fa43abb76a34 -:018c7020c2bb26bae2db14fb5e12c09637fb72 -:018c8068ad98c3fce6b10992251db1a592af24 -:018c901e8e06f85b9fc4a693fce12f22d87d8b -:018ca0940f145b6f9de7ff3d1f710f84988491 -:018cb0b753cc1cfe4f7805cc1d64f3632726f4 -:018cc0a41d5e0daf94f382d139357d4d92d547 -:018cd0bf39afc531a37bc0c9cb900b636df794 -:018ce02c58409d7e19727982fe0043d5f474f6 -:018cf0354123c085dca026194e41e50a3e0280 -:018d008bf61b8d5eec2b366fe3ccb51d53b305 -:018d10a911ba8b1acb7a338884524dfa1c3778 -:018d202f46bc0545a88048914a97aa3c2f7c7d -:018d306d64acaaca0ce849f827675df0019a4b -:018d401c8becb3ba48c8a20c50871194111d75 -:018d50b7bb58589200012a1858e83c12e481fd -:018d60f45a8cab99509532a0c0af776c56cd3d -:018d7056b9659f3c8a222d4320b1e2f331f9d4 -:018d8031c3076ae5a678cf56a25b3550852452 -:018d903197b9a1fe923ebb6596f2e8ef60b5b5 -:018da0cb6f73a0b3c0ba152d5edda15256befb -:018db0150b4b5dcb70bae505cb1dd753a465b3 -:018dc0c99d698677e32b0437d9ecda64bfc6fd -:018dd0012a02ddaf8eb6dab7b790d0ed27ed71 -:018de0e7d04ed532fdd490b36b93fb6321857a -:018df064c78bff746cd0534330d4524a94971b -:018e000fe2d56a6366a7701cdbbdf9da35aefe -:018e10e5d38b3fad2a8eb8a6cbb4714f25d7b9 -:018e2013120a8f0ebcf2c5a7b3dab4c2430bb5 -:018e3004fbb1ac87e13be8629a3c5956e79d3b -:018e4026dc3cd3b7a953e48eede813b6fbab59 -:018e5073eebb70a73fdafe3f955bba5f1ee251 -:018e606705a670344c4682b4d7024d15de594d -:018e70436ac814f90c03413f4600c705e29bde -:018e8085b9371e6d9fcc6abd2227d06ff1a1eb -:018e90ec6050e0d1aceacf48855753d7028572 -:018ea0e1d7a301e355534fe6676a30409d654c -:018eb08b59794fb53394556080552aa8e7f9a5 -:018ec0ae8eedcb36a01ba9cde3b1976ca51126 -:018ed0ba001bb33369a54c534ec09f290e3b7c -:018ee03a485d8aa5e46880c1bfade00152984b -:018ef03e937d1ba9245b6fa756b5e1960040e6 -:018f00f2295dc429ac4433e067fc53b820322b -:018f10e3131bab7f553853b876d94d6d8ac1b3 -:018f20828bfbe144025b337d557ea518cded30 -:018f3083193c33b42a8056be1d7afb504c7134 -:018f4098539d9ff94815d0f82b4ac1ec25f123 -:018f50752be03f1e8bc3f11a60360c483b80a5 -:018f6044f1b09d37fc3acd6364fac196b49d5c -:018f701ad3499f0df53c2ae75e6690a9c6d990 -:018f8061acfa9d879807ea56028d0c4982768f -:018f90c667d6604b4d2c19ea89d64455b75558 -:018fa0255c3fc2cc236ddeea8b608ab6c6f557 -:018fb0782a3ae255afbd93f03443b9e3f42a14 -:018fc02afce8ff873115616fe116470c889b69 -:018fd0c011f5c52a6e43c31484f737c909f141 -:018fe009c25fd60fe32c3eb1451cc9c742da14 -:018ff04567623213b757eccafd42f219fa197b -:019000ad4f0d7fa4b6ade858dee67ba7e0a096 -:0190109fce6ff5d4fbe8ffef6e83ff4dbcc4f8 -:019020af3cc0ceb1396710d7d78a85e88e40bd -:01903004196fe70f295af9eb90999ee073853f -:019040f09c3c15ae5683bf4c76ce70d459bc1c -:01905005d6b929ef2c54a763402b484cca191f -:01906092a52f2c591dbacd7f95359c832feb76 -:0190700ed7648d9013e12e45c93181e592fad3 -:01908010760a6667b1363be0c6b6bb946dae46 -:01909038d6f76c7de5a142e0d6b6887375c296 -:0190a0315929777a7291ca469a548d9d036282 -:0190b09efcf6d685c724a7b33e1cfd518d392b -:0190c0b60467e9a83eb8a97414534c3bbd5a91 -:0190d0bef6ae8ce6f647b7752ccce5482e9018 -:0190e0d77775833c72ecdabeacfb48cfb12423 -:0190f00c3d279fc752adf8660e58d8a8b42ae9 -:0191002e4ea395ba71e5f512e05db8a019006c -:01911002843c8818c3a830358fa2be30f062da -:019120c3ec128ac8eaca08699089b2fd6cd637 -:0191303306e90e59c631d258238d51cab6563c -:0191402ee08d673c1e7e5bf73c9444d7f8e087 -:0191507b3bf6ae21efe4dc63b212b1dd659952 -:01916092eb92b941021e6fdb7443b75466c5ba -:019170c83c743e4b386b17b3f17d7eb2adedbb -:0191803ce01b6b187d0b8f8112c7a1db943a52 -:019190e4d23367245ea25d7f27fcdb0c989783 -:0191a0c6b3231ab85ba6409a72496367a0e0b6 -:0191b0178798d0b72290f08089e6a6c9e07626 -:0191c03b13dfca62bc9b827211a2e245551fe9 -:0191d00f6418424ed3a5a9d7ee9225105961c5 -:0191e01f87ec659e3dfcb095b9ed09b00ab07e -:0191f06d5bb2bb0bea29b662c02c863026be94 -:019200311a737adae765545f393eddb20a98de -:019210307754c10f04a86586084e6c8219f63f -:019220550a2c8b69fce21b91df2c058738f0e9 -:019230dd16d90cf0f529a64c161c00633a1ce7 -:019240877756eff79b8c9cd07b2ebbdf3ee618 -:019250d47308a114de286eb20be08696e0120d -:01926050dff304b69fe96711a5ab659c77d589 -:0192704ba775872a18d8e83aa4e2c6c0ad5ce4 -:019280ca38c99576699ed2d2d72fac9a45f64e -:019290446eb0697ab94a39ced2e75a1870a773 -:0192a0d4b6eb69b48e7821a6882d3ea46c8e31 -:0192b0d818db0a0cd2e0c03982235ab67eb04f -:0192c096dfa85d372ca7241ff48fd78b9bba52 -:0192d01f91b27b43dfc59cbd4e29a95eb29188 -:0192e0e5c97695d2c85572c38fad41cdcc9753 -:0192f004b6e90c552191019f567c63c9dd1516 -:0193000677df99ce7ec5ffad8828ffa4d1ef99 -:0193100fde8519c3d1ebf0d5a37154f23fd496 -:019320b4f5158542585de287cae331ade1a9c9 -:01933010546ddba03bb0a9906ae3d64abfd14c -:0193403ef085ed239371229b571266d034bece -:019350a4dca8ff0edc7c4463b79e7c8617175f -:0193603eeb22d58946aa61b9a0b80a9d55643b -:0193702e5f9819a3e8e4a2de6cbc1ae391646a -:019380a75be1a010d328bf93464cac5c1b1a59 -:019390c2ff422fd7f660bdffaf1fe6b99603cb -:0193a077505e63c0361097b7618ff7d33fb4f8 -:0193b0604b18adb77f6bbf9b442b677e904464 -:0193c05bc66e9c4b29990ab6b81848df84277b -:0193d02263faa8d9eec8273eb32172b6ac4a5d -:0193e094939062e277d0b993360ec8fa19a6be -:0193f05abd7e2141b8f71ced103211aa50e552 -:01940097783fb29887708adb590cf918fa1595 -:019410d95b199c2b5092a552409e8c4acd4d23 -:0194204aae4a4f859873c5587d5ca1ecd3dab8 -:01943031a65b5741807db12cc97ed4c6725a6e -:0194405d77c3ce0a53db4d386fcde89b739904 -:019450a534b72456f071a0bafa474868c29e66 -:019460f993cbf6a92821612e6c0c143b9e6fa4 -:019470f719245d81de119ae598ebe0315081b5 -:019480e32aff99b8abb7db7e82b6ba2dd0743c -:0194906bb6d15410c1008d44130330f949cd7d -:0194a01f39f26da71800bd3c31f4e446697dc3 -:0194b0e8b337348ba1330d4d502423f90dbd34 -:0194c08c401187af9d5fd812886dcbf18ccc97 -:0194d07d6a9d7305483b8a7b0e4109ad1d5a18 -:0194e0ddd6cfc22e287e6c802e9cd93b823881 -:0194f06180fe914d87ac0e9454644bfcbe6154 -:0195007f294ed7027be2710a576aa1926d2aab -:019510f4a2c616a468dc3b1f4562f70bd2ee17 -:0195203f31894bc5da8623e213a4ca0a3ce120 -:01953036d07b6ef19c1c4ecf27d70f297108f1 -:0195400e028659a67aa8a22e3fcd19bab67722 -:019550580a6233c449215e1a78b18903c0ed2b -:019560d3e49c4f002a892f87650be8722105c2 -:019570e9a4e040c9c74bbdc251d04937dacd88 -:0195801ff3fb5a92867ac36756bd42932e90a8 -:019590170e77fc87d2256ab0089cc3aac485fc -:0195a0d61bb8f30c270f69f46df2ab96738c71 -:0195b0bd849e7aea524f82df26cb5142f9ac32 -:0195c08c0ece6fe237580a029c0816ab7f3a0d -:0195d003b6d56857cf1818f44641a6116a3425 -:0195e01f3178d5cbce5234b19771b79b1418aa -:0195f0931e2db3eb2eea8d43e355eeca4a2792 -:01960088921c506bf1cc44bc86f2ab26cb860f -:019610c3e6ca8da5d1bb983acfd6e21bf50e86 -:01962007cbbca9dc68bd5e3416c8a8185fc412 -:01963057379629ea13931c328b04f84a8b1e0f -:0196409992ae8fa5e521406353ed4527d2fa7a -:01965031e3514612c2842ba5af8303ef94171d -:019660282df845aad22ccc32ac531df5bb9cf6 -:0196706f99e1ba46a53d275dd09a1d3c79de94 -:019680c98ca6fa420e16365ace9c718bb86a93 -:019690cecd37d6d389f711a4bd2e01a7550cc8 -:0196a043b8cfb711ad7bf97ab7b2c66c8f4ac4 -:0196b009db9c3756addc9ee51f561b32dd56b5 -:0196c060a464b35484f3946c6167820f251f3c -:0196d019ce846b59801cb48009029b5e3bb0ed -:0196e0fcd420269275b25ec5396a22d89645ae -:0196f0627ee9759cef67b4db39cfb35737958c -:0197009965496b7cbd1d8a60946281c9715773 -:0197109212e5146fd69239aa024ee0952f1dd4 -:01972020110db469d2a4d52e089869426212e9 -:01973036def7100155ec4632bcf6f880f85429 -:019740cba0334c41e09701896997a985647e91 -:019750526e9e345b30e942603e9cae5f12a58a -:0197607117a3aebcf6237a9cb21b5682598b3a -:019770364cf178534662a1dcdd1ccd80319056 -:0197809b675344ba2c5b36241d80dcd851326e -:019790b8cf298c3e95455ee410248406e9fbe7 -:0197a0bcc819130822df755a5364f80eed736d -:0197b0a4a5bc959acf177e5dcb424713033e44 -:0197c07d83dc8eb0500edac82f61b4b4d65b15 -:0197d0186465707d4e3f2443a2d9a88af72aac -:0197e06e183b93952dab1ab2f2343ea5c667bd -:0197f023c31727507f2ed2467deb8566eb233e -:019800df5af4a626e6d6d52c8e65b98b73a21d -:01981004dd5cd8bb552d8751287757f84dbfa9 -:0198208396af7017dd2790e3b323d8311ee21d -:01983051f11fb23833e4884f39e641d53417a3 -:019840825d01c8f8cdb7d84e88d40bdf89a511 -:01985078f565ccd7e2ef670d49d8c89ba8be6b -:019860dc6753e34f56b7d061dfacc07f1c39e5 -:01987011988f911a0f952d5a4c25042cb8f17d -:019880eede8aa895385a1291ae9d24f7168ac8 -:0198906c8abbe3a9961a6087122260e5c27958 -:0198a0e560fd14facc3b56e66ecc6f4f97a68c -:0198b0aad47a25f9981092e8bde7c2dd77dd0e -:0198c0b2053478bb7bdf235e3d004755016ed1 -:0198d074a712c8890f227ed8688cdc6d904ec5 -:0198e05a7fb115eb31dc3c57582eb0291c468f -:0198f0d3e6e84b9c5f045150403f4cef6e3c6a -:019900cbe5d346b5cc8ab489bfdd388f87e30d -:019910eb124ef88cfa6c68aaa921d7c6454538 -:019920043c9ff484e0aaa3764790ea5d9ee4e6 -:019930eeda84e1e9ced1f1a20c7c6ec30418d3 -:0199401084996e7682fe00ccc009bc5609eb92 -:0199508735b472959d041d40e25f8ee9a1bf53 -:019960bf8bc9d812c73dd65d66fc10527041e2 -:0199705ef9437066b8d44401f646c50bc86c6b -:019980aab7437e57935eca12755de7ce692846 -:01999079ad07431e8df4d3ad7561320f7368be -:0199a031b08f33be7521c731f10cf80e4779d5 -:0199b0cc543ab9b6774c5b2d1b8605b3211755 -:0199c0fb8f1f9db31ec072213b580f2ec4bc76 -:0199d00b914a5876b71a600878479a1781264d -:0199e06ba15cedb81eafe2f282370dae66d8db -:0199f0e08c11ee3b1b5071126f0ab68533b4c1 -:019a00f2fd9d1c3bb998983de817dedaa57044 -:019a101670b2eb979ec62ab02874224c51ce1a -:019a206c311154087b1639815f710fc66587ff -:019a30cc50a2a7cf9c81b94d08caa8937259fd -:019a4089e6d174dd6e3c8f38fb5c2883995d76 -:019a5090c31ff2be8f7349297ef3865b6dfc41 -:019a60a3a06cf6e1db46f081d85e942c12b4b5 -:019a70c62c149802449d4f6e381a2d2d4df35f -:019a805058bace0624cbcf4319544b27e2df96 -:019a90af5bd962c78b00fd022d80d1d78b44cb -:019aa0a2ad39b990af597c71c4dfe98c790f6c -:019ab090a45f4f91c32fc839f59136e5639017 -:019ac0ff72ffc809a0c3dc1b4337e11ba6dce6 -:019ad0b5c05b79d39830c48ed586268e97917e -:019ae0d1f4f4349f2e599940badd871fe70be3 -:019af0121ff80511fcc8caf4e512b41f4ee7c7 -:019b00a987e836f736ccae3eb53be0d38520f0 -:019b109d4faf58f24dd5e24a0e8806d174c261 -:019b20ea2fd799bc34fc0e9d83c349d2f535c7 -:019b302f2f1c44a1250e149fd856d88ad43e44 -:019b40eac1b498cf534b0a852d9356c0bd3d5b -:019b50a60776d4049bd030846c208796464f68 -:019b6061bb54860622296aa25435f9a48d33d7 -:019b7068399d19728aa35088ef5522b095388f -:019b80eba89a8adf670cde4488fb4827182ece -:019b9063555de1099286b53514599a9ae222c1 -:019ba07edf4bf3ada00bdc99b8469a61a7cb1b -:019bb0ed4db48825a949b486432f2bd0de7f9d -:019bc0448ab18bc475cbfc6e39552df58f85f8 -:019bd0e6ca7fa67288541ee11192c2ea331c56 -:019be03e6cfaf6f19b49439eafefc63ea417f8 -:019bf0501cda23c755bcc3b9a1080808f711d5 -:019c00fc24c160cc040202f00914e84b3b6836 -:019c10920b0ee412116f12ecc5740ad4b20409 -:019c206122ec7b5593ceca9836bcb8b7fe6461 -:019c30b2eacac4e372b6a40024927cd1bc2b4c -:019c407701a828c6a46629c74082a2d3bc8a78 -:019c507e4bbe225fa2cae25de5f92f39cfcfca -:019c6008174fed63e13f68b2126e944d3e23af -:019c7079ebf098608c01d6e8d1263794457982 -:019c80d1fba7adcba02e15d183c853019cd402 -:019c90c3df748c2df889a517b4954339713f36 -:019ca0a1aa282e860dc96691b03c90ea5c2652 -:019cb02c6fccd299a9396e2c4023af21a5b2bd -:019cc0481bd1eda5c3f8a9728faf215b63ba17 -:019cd0a750537d1e5c4573f8cef1137812cd1f -:019ce05b9aa20ab40ec2484bb3779ef2bd4189 -:019cf059a724eea1f1a4beeedbe22444b4f191 -:019d00b004d3c250095f9f75be96d27b1f35a3 -:019d101c68939e5f134cc3019ee07f7f23f19c -:019d200a06aa9309939e6dfb6efe8443ec7b93 -:019d309697520d6d55aa13e7d4c6d7f4122fe9 -:019d40259b96fc74c07999d118f353e8e7fd8c -:019d50e16718af5f18536e2e5e19c7ce800931 -:019d60b3523e9082a48a435704e3ab5fc3f06a -:019d70cde81846bc36634e758be28971ae7492 -:019d809f14db68c6cc151a3217b852e0823f88 -:019d9013e8c6658abe7d538fdf9eaec3799dce -:019da06a417b283ebcbf9ca3f02b0e2a1efbcb -:019db02cfeeb776897f9f3a2eea8fc977ffa76 -:019dc0f3a643982eb0f2e5deaec4e1e1923c59 -:019dd09d62921095a956db1e8a2ca630803cf9 -:019de01a1fb89cf5b4700a0279fb8c02faab92 -:019df0aa3f72ec93df861dd2c72a00121d9e3c -:019e00d9889f7e8dd94a765ea7e4b0533c7d11 -:019e1057aa6131f689a980ad7b5fafa0bf3ede -:019e20c73683e7e9c4c735983449d7c83f992f -:019e3084d5fade8c82ca1e002af3aa60f319c2 -:019e40b9b186d9f23072bb7256ca70fa5e71ad -:019e50447029012d57daea5e437b36e07a499c -:019e606790b8656e3ea3ec57779e226cada380 -:019e70a1e510717df3a2afd68a8636fa46f043 -:019e80200cdf0792315ddf0ec5d167af40496e -:019e903db6db021f6137fc204e4b08de0369ec -:019ea04bb138b537bd3373332333ba5ddb73dd -:019eb0cfbb8d4aa703f54f367935c0354942b3 -:019ec0a91bde8101dfdc2909e4f1ea2cc89941 -:019ed0bb63044b601db8bd99bf49b31c583372 -:019ee05983a7018931859abf609fd66ee90440 -:019ef0473158ffa7f6bb240f625ab82f2df765 -:019f003911a049dbfc24201889f2a91700d6c5 -:019f10d72020ad7e10810e2e7ad17ec6490e44 -:019f2096e0e63f5db82eebc89b4c5c0be9bfd1 -:019f30b5e15f334f2d43afc0ed14a29ead03fc -:019f409cde575acb7f754508f235f303960f2e -:019f5073d752f5c69e238f6b07be879f66f0bb -:019f60c5b4df76368e43e034e59eec1b78f076 -:019f704383a65f12c0c946a97788966c34ade8 -:019f8093746c640209aba95ceec7fc3ec334ad -:019f90899502173eeaa83c0027bebc120f17a1 -:019fa05a1c2bae3ec47ed8567e4d090c93f63a -:019fb01546a1faf29f1c5d65b3ca08058e658a -:019fc0d908ba59d0869080b65bd70bbcc42b93 -:019fd0d81dbd3aced8d532e14d8fc5b3f28d04 -:019fe02cfe2e7f38cadff359bebe1bdc4c47d0 -:019ff07398a827082f40d0b0e2dd4d764b6282 -:01a000b025adfa0d643ba7e7bd522199b69868 -:01a0101e9e87c1ebf45a5b4ccce9d42206daf3 -:01a020366dce34b800fb779495e095454b976d -:01a03061dc0898f8f4d9fa7c6af5dee8c2af36 -:01a040881c6c37f8f767452a58166a9de3be9d -:01a0504e28554d94b7098f42be6a10dfef7dc1 -:01a060f208643b067adf30acfe81ba35685666 -:01a0708abb3d133222d9b2d9f8f1a8c55877dc -:01a0800cc555f79ac1698d11dcc3dd729c3c73 -:01a090d505431d8151c712f443a148f7da6db7 -:01a0a04a468196854de754e6788472ba351e89 -:01a0b0aad53b61d6ac8ba398a9d66e63b5c3fd -:01a0c0527fc7a4afdd0836bedc6e388bc6cd3d -:01a0d0b72973b84e26df54c08650eb0e826441 -:01a0e051607e6b4a1d869e3d9f14397ac7f703 -:01a0f0acf7a885e52d1fb57c2b5e51fe7e3455 -:01a100d6bbb7df92d3609b524132ae4ad61ce0 -:01a110e119daf38b59646c5d6e48ea8a0fcbb5 -:01a1202a4a15ac996ed0f56d5753e50aee9f7f -:01a130e349f11afae457df0cf8e1e94860b8b3 -:01a140b81af46b637f5e407daa20c0144aa8e7 -:01a150fb5fdec580ba6be69dc2dd968df679f4 -:01a1607db12225d874e600aa0aeefa3b737366 -:01a170fdb07ddad458305ee9dd273d17d57f68 -:01a180636b51a3dd2e13b2cd7a35b446609a81 -:01a190f7bb75887d6e723f1c566e9f0e9b9738 -:01a1a0aa645fee9bf8ee56f7af9c26f610ac13 -:01a1b0234a1b3ffed9ba544e3743cc849b8a5e -:01a1c08a414fef48699068ee33af4a2f19cacb -:01a1d05d5f11e8e087734531fcb5526238cb6c -:01a1e0e16611c98e5b6fa37feb63c5f5e97924 -:01a1f04270b947ff17b55bd75f2f089300dbb9 -:01a20002f41b313a3d340b026a48ca1ca831a8 -:01a210d3a8061ce7707439840390a586a89472 -:01a220715e8939bd437b86320ef91a7f8e9d64 -:01a230c567daf9dd157422fa1c58efe3023ae6 -:01a240be4a308707d1fc662eacd204d780d394 -:01a2506873dd27112a5a2bdf234b33d44ea7d8 -:01a260f60d12f91670cb156e0dd03a3c9be8d3 -:01a2708afd2c79d91a943f3953875dfaec7cec -:01a2809e2d084af32c2ead25ba83d2a1dcf827 -:01a290e9cba785a67b2125f49c3767f5c2c2fb -:01a2a0844fd14d0b5fe368e9c1844ac7b01d71 -:01a2b0ff66ce90772f53173b4de8b571094616 -:01a2c05f6ee21a1b2ef35b805ae1646b6bc343 -:01a2d020da2ba57d66e99ace5cc93749dc5b5d -:01a2e02ddc67ba8551d0d8c56d56f389572cd9 -:01a2f09239efab3617c1045fea3c2b6f116905 -:01a3007bb707caf72f0dcf5826e5927606c655 -:01a3104fe8dca3528db6bff100075a81d5b2d6 -:01a320b7c59efb36aa98c2fb6095b90305d5b2 -:01a330da35f1cb491fadf292e0db6b918b7cb3 -:01a340971c6ce7710bfdf1ff84308bb6409f18 -:01a350ad1b95c9e0dfebba35155cf19cc4a099 -:01a36059613cb0e764b58f4e2449c52c49433e -:01a3707b1a0fdf9e5a8e25892e34b9b71dd671 -:01a3801a136ef8a0e680fb79416dd3414ec1c4 -:01a390d9acbe1f440c85fec360871397631197 -:01a3a02a53105519ec9491f1f0e1766faf98b0 -:01a3b0c8a0a6358ce04e55b139b8b53ec046cd -:01a3c0d67ab8ac742c1fb7f9baadebd4305845 -:01a3d090451f9672f25b546e8f0229f78995e6 -:01a3e0d51239e81a120ac047d963d131cba09e -:01a3f034cbf80c3ef5096663766145044d4db4 -:01a400f8b0f18c640bced7d04033e685bb449b -:01a41080f8af6da206c1cd07cd27dcdce04742 -:01a420a40b820fb3c2181eb1dafcd6e94891ec -:01a430e2a3cab8efa8c1d92d76053e22213f8e -:01a44023614911283f704f006fc84c2216ce46 -:01a450bf3580377b835d408ededb95ee9dd489 -:01a46026981266a9f48ba887b65c264b09bddc -:01a4700f7fa5935c8ccfb480ee2c551061944a -:01a480175920f54153a4bd7aa82b7dd39cd73d -:01a490eb25d2c621b27ac03d90b53e6d930e87 -:01a4a07b7ab6669b334b815d2fdbf5fa7cfb41 -:01a4b0feccfee515f7122327612580c6055e4b -:01a4c0da3dc6a450d6e096c89e90f03d422420 -:01a4d09ba35acfd28fc4db5253180e660f45c1 -:01a4e0d2560ed5b7afe4fba4d51ae08596d939 -:01a4f00009f48d5272ab9200f3e01a4dd41f15 -:01a500a9ddd180b3d824d09c1250d983508dda -:01a5108acca740f857d7d6ccaa6a6eaf29c945 -:01a5207084f452418034451f41dbb449ac17b2 -:01a530fd915b24099d8dc68fa31d5ef8b3c8a0 -:01a5401d68ebb3e812fa3229bdab741f395c2f -:01a55069e7785c5e80175c0f42e8432b1d5476 -:01a56059c516a054a23b977172f4c790ed8cd1 -:01a570c7bb39ff549a98664a7402fa3d2ce9fa -:01a5801be52f9573558e12cece00458c1a67c9 -:01a5905ac189f5fe525ab3a877b9c7b70f4022 -:01a5a00a1ffd03f47d63df4f565b2dfcb88074 -:01a5b0faa38aa36b8833772917ce84295bb79b -:01a5c085f183765e0d3ea21f59ab2c8fcce4dc -:01a5d0e2c93dea7852458e801fd8946999d01c -:01a5e0a2bde37d9c9768afdd871fb4e55e2946 -:01a5f0f221e2e0cbf051cafb69203700315e9d -:01a6000ec76f34152c7bec6c19b1c94c94ba85 -:01a610cf7732a02044c6fdba1192ded2713023 -:01a6202e6c1b74cfa08b70bb0a4b966cf51441 -:01a6305849f821f27eb3973dc0dd220d0c8ff8 -:01a6408abb7016486e124094e7d52939769a2f -:01a650799498572f5b8291b7a30043cde88aa8 -:01a6600d0feecf208c6333139608fa85fa476f -:01a670da8c4b19a9ea7560d91f1732472e2951 -:01a68045d26b864344174e9913685271dbda26 -:01a6904478972913f461503dea436620d411d1 -:01a6a0d398ed519494432056c17b69dd889fec -:01a6b01e1e3549e9932ab57383bd2cce2bff54 -:01a6c09d529d5563163ff06c475052e92a8aff -:01a6d07e471e08327dd4c4553a67c2d179df0e -:01a6e093c78128b6e47eb0dd7096f5f95ab129 -:01a6f0d26f07669c1b32284d6c5d94ae39be5c -:01a7008a7f8b94ce10a59737bb6030e7767b3b -:01a71039e6c778124d177ee3fcefb6c1b28087 -:01a720d44f760fd2b210ac1cd186bbd3f48d65 -:01a73027e95d85f60e10578a83987bfb6173e0 -:01a740a7e0aa41445547164b6fa6bee75e06cc -:01a7508ed6400f1284432f2d710e2d5a138d80 -:01a760f7973d08ef1d7f8c3178b41750183e7a -:01a7707d434bf46eef2c112106c32c2ee8720e -:01a7801585f67c90be323dcf6db80512ea027b -:01a790a2b214293a08da98024c4b5bc8dbc50b -:01a7a016728f81cc697e93d0eaa89dc0c1b9c0 -:01a7b0a06e6fb5751dacf57412ecc2c79f2f10 -:01a7c004d32f0daa40b37aa550c2ebb5bbd62d -:01a7d034546ded4a40d6e9cfed99685bfc5243 -:01a7e0272aebddeb385f4f9a0024570bb9b9f7 -:01a7f09e0c5ee072e6b9b815a57387edc4c10d -:01a80094d697be7fdde9db84b3449ce649ef97 -:01a810ab62a443547ee3fc1d6e5bdba66d9167 -:01a820af092a77db1a40f4d1ee1462a57583bd -:01a8301cacd27290de9a748d11801b82aa1158 -:01a840439e8697719329c150d03ab6834b9efb -:01a8502fe4f5c264cc809959f79313655d2f65 -:01a8606daa32af8380e78cc40d9b3c2566765a -:01a870512051df49af5412881a8724431d191f -:01a8800c17067f14bc6ef9d8a1562ac2cb6757 -:01a890a171a2b491187ae1fe49280b54f22f33 -:01a8a0d43e6abed1e33b434f12530a23c0dd20 -:01a8b0ae5d3a7350e5967be59e22d7f0372bc0 -:01a8c088ac39863fd9d145bdb1297c7c4db303 -:01a8d055ba10190e17bbe68ece0d7ad5e861c8 -:01a8e0f070f895469892319cffa52937cd3692 -:01a8f028b30954e24918b371c3be6d23ceea3b -:01a900e3227f07ce1d5ba7d96d68d650a14ecd -:01a91026244e6f7f3f1fd7fbbefe7c83b21f3a -:01a92052ea03ff6d0145bb8af83a861ec852c4 -:01a93032b5dc3927bfda100be15e49cfa2396f -:01a9404d928ac07e073ad19c9b372c8a1115e3 -:01a9500bbf2f6daa45d62b6895b640da08d910 -:01a960f1f4c222d8899584a0c87ec2a19e87b9 -:01a970aed55e1e195a40a4304780d01ce57555 -:01a980d05a0d6d671097287cc725c3ed66acbe -:01a990a4d4bea715eb56759147bda91cabb712 -:01a9a03acd35a6051d9afa0edf370f6676ee14 -:01a9b093e155a368cdc904dc2d039f181812d7 -:01a9c0b35a71f1bf97a024fc6459b749f91ca2 -:01a9d0c4b98033e2952685cdc4508b5471f3f1 -:01a9e09f7e96964c08b1eedac4e8aff556b589 -:01a9f078ff3fcf5404a738ac55ae65a89f2a4f -:01aa00dcabcfa6d26a65f3fbaea82e0e247089 -:01aa10c9c250e3e651ed2f294312af2c2cfb4d -:01aa203df3925d0ea397ff1c1ab3a196f1b998 -:01aa3074edcae4569ebeed7119d48f635eab20 -:01aa4092ee7c831e7ea138288949f456574cad -:01aa50cb428ab6b81c6781ec3356a765849eac -:01aa601d06deb901db8cf3a391dfa038bcb1ec -:01aa70c036d287e48cccefba99f89906408590 -:01aa80dfb6d3b59a51bcbba4d56ea5a3d92314 -:01aa90c3292627bcecdc2e5c15aea3841d6aee -:01aaa08ebe8cdc627a8fc97b2508579914cb32 -:01aab0701a6e23333b2b7cedacb1d7459a5ff7 -:01aac0dbf1035530c5d804bf9cce2612d4879d -:01aad06b510d736333ae4b38a95c4ab551d4a1 -:01aae0cd85c44b5eb1d5083ebbfa2bbd1c55c0 -:01aaf01b384b59090f451f5ed73bba4f5fd741 -:01ab0083e8b5442aa5b897a242e35f6dc74e71 -:01ab10179912a3f413ff93678337e64ae82ba5 -:01ab2007cc73288d314ba3f239e5cb25676a4c -:01ab303763ea5b15fe22790c3d19ac1eae19e3 -:01ab4045110af745408f7f8feb4fd7eb680e8b -:01ab50f5c955ac23a33b561c37152b66f5e963 -:01ab60361d1c958613b7c0b2e0dad41b2de1ad -:01ab70aadbc7e9457a10a31363b927e16950da -:01ab800ab891d82004d2e4307969b5fad0cb20 -:01ab909388be564e959ac213428299781d2262 -:01aba0aeb52c58c0f7af63d54aacbfe46b43f5 -:01abb0829dc52a8c10f1013039063038b91360 -:01abc06515f003940c539a5b4004fecd298d32 -:01abd0fc7db84d88f53d031d91c2c7f062fa6d -:01abe05493a3c3a7b25860dc924bf81074814d -:01abf08486da268019ac91ef66a53fe3154ac3 -:01ac00833e3c38ed2dbc3dfb53b983444eaf57 -:01ac1009400d3cfd80bc6f3cc36403def45462 -:01ac201004da2a55b479688a02d8337c93e11f -:01ac30278094283142e54f611fe73d8caf1ae7 -:01ac409ce0d93517214495808c167d0584ded2 -:01ac5009b52c0659fa9d42ac003fd0f400c3ba -:01ac60cd9719a1c5dece990b179256e55e140e -:01ac70fd835287d0b55a0956d67865165ae8e4 -:01ac802219f4743a2fcac749914d07df544114 -:01ac90ae98506ec34a367faf2217ba62110bf4 -:01aca0f16834fbbbb82ad7edbe0f23d4ffc3a5 -:01acb055958ca586cbf957f45c759efc8230fb -:01acc0f119d1f9b9f38afba9ada3d517390486 -:01acd0c39bc3752f3d62c3c5c61ce7ea9b6b5c -:01ace0dbe02785217d12341a7bc6f46ab235c7 -:01acf0840b48b744d54dbdad8fbdafbe7f60c0 -:01ad000768b84d2ef81d5e72d82330c4609cf8 -:01ad104f457087e204b0dc6e4735540216c36c -:01ad20c81aa6598b1281d472bae9ba6059520e -:01ad30a28e171360d082d8957265c1cc28bc83 -:01ad4055a7b58e3b28627d8c3f78efca3f7f16 -:01ad50afe723178c8234f012049a1de548e498 -:01ad60df046bb47aae3785b234a242d8b8d002 -:01ad706c94dc5f0ac8ab2e223b3da960381607 -:01ad8046827834ec2ef5993988f5390c49320d -:01ad90b6e1a2316daca5d8154cac41cc7e56c1 -:01ada0d2da174387459b22488d780a89aa0731 -:01adb0d695109dcee3aebd5c693ff75aed7251 -:01adc0011dd709425556db1bb8b1ec69b598c7 -:01add012f90b537a5c2aa72cc2f1c46408d395 -:01ade0c7cd722cb8961474c4f3b507713ad888 -:01adf0a21d5a1861c71a3e9a3d6e294354a660 -:01ae008ec0531678b341c996d8b3e8278307e0 -:01ae109d706e4dbb2e846fbcf9dd903d1fb965 -:01ae20635b63c66ccd1301d27c51a25ba4c172 -:01ae301027fbaa6bf4d83dd5fa064ae6d8bd58 -:01ae40f2d29791605180f218073a6674d93cd4 -:01ae50e04a866e1688c433e847818391fe790a -:01ae6058bcabb9c84eb28e923bebfcd0b3daf3 -:01ae703e7746910e1395ddf1562df20830475b -:01ae80abe99fb8a908b59fb45d9766ccdb441c -:01ae902650803e5b85e2741db3d1eb4bffb751 -:01aea0da8dbdd5caf86b8ee4eae2ebf356cd37 -:01aeb034249d7e9061e1e6506dd1b99f239635 -:01aec08d5ca401fa17d7aa47f7753f14b12281 -:01aed05a27b31495f527dc35c7afa9e3fa67c9 -:01aee088df8cb9af59ef89b64206cca89a403b -:01aef013c936a96a09a63de8381225daeeec07 -:01af006e9699486abaeee31ad302c9391cd14f -:01af10c2f07c9be2fa4445a01e55c5dd3e1e92 -:01af2004f92484271e3a53410a9c204a413cb6 -:01af306acb9ec8ce99980319552a8bfe612862 -:01af4055e0beb483570c6a53d9937cefbd915d -:01af5064ff0aa4f939727f688a9889592ab9a8 -:01af608150dff175dcb3bb2d92eb8d03feabcd -:01af7007da7c2aa53d0bd7a27f3247dd197841 -:01af80b38735df790042b489f3a45ebfeb8789 -:01af908b895dccbe8bb69ce074f2fa8b60e730 -:01afa02cdb66bc4187bdf053fab18949a1e4fa -:01afb01ab7d05d391ea02554bfbd349ee09a3e -:01afc0719c5885add19e97729711d0e34dca70 -:01afd0c211a6c0616cdadaae8b1a1962e4ae29 -:01afe00abb861bae07c00e90637136a3361260 -:01aff0b912c3e0ed27a9f992a53669f34e2488 -:01b0008699f9bc7f242bc28e1cb15423eda91f -:01b010ca724cd3d31ef75c94ad5048fd322ba6 -:01b02031feb8dadb7ecb898095c31701cf2313 -:01b030cbee600207d933bb407a766a7c096e49 -:01b04014c3566bbff9e6219fce5d4513e870ec -:01b0501129a198fdcec08ccc563a1ace602bd6 -:01b060219c70fa9cd7937ed1a9dafa04d3eb35 -:01b0709011877038fdd74f0f3944cb8df7441d -:01b08072a713ff534ba77976a178d47245aa38 -:01b09026f9d7111898c55df979573bfaa4a43e -:01b0a0e0522e41f3902a952807a07b62268c25 -:01b0b036fa70b410f5dea6e5d7d67c219adcc1 -:01b0c0aefd72a584d01d08572031893ab3f6a6 -:01b0d0cfd3f461a8d13ce45129debaffdec0ca -:01b0e04028061f737adc9b36485ae03db5ac2b -:01b0f053e02578e133d555252f56c019c1920f -:01b1006c99b46adaf72f9ce12b56b1bb6f4afa -:01b110814886ed627dabc4375de4446a59d005 -:01b120d079501be8f5e09b99ac4ebb30ccc887 -:01b130dc9d214143ae8c374efbb83f5d512ba6 -:01b140c5155f18efc175d57167a76bcee3e618 -:01b15091c22eab5aaee72b8e9a033b37b171f4 -:01b160dd836491346c4d59087f3a11c11af335 -:01b170171fc95aa65d5b96060464d1ed0876bd -:01b18035557fa820b63d66dc9b283eac660b31 -:01b190817d517f6633b280222d95f872c46149 -:01b1a0e86ea276951d3f9b9327bf88a266a8cd -:01b1b017436673adadea4e28c485db2cbbdba1 -:01b1c0a1b0e7fc4b15a78dcd1e804e740ce34f -:01b1d0da2b91b06be09c42b902a6284cd9faae -:01b1e077ed6d9b02b02731a289d8e8fe3d6692 -:01b1f0276f76112292987a3a6d89914eac8b18 -:01b200e5b54358fc1e4d657f2025dac21110af -:01b2103d57a99dc1a3dcfb2603a74b678e21a4 -:01b220b8c173088a76c5abe66ef6c77c5856bd -:01b23059efc4020fcb51fa255c2a17a7037716 -:01b240a674e70dc7efde54c0d7638922f2bd0b -:01b250e58573957c6262c0732dd962e355c97b -:01b2608b227d368cf85fdf013bae011ced05cc -:01b2704229e8245d0caadbe14d3e786850f5ca -:01b280fa11fb3ec905dd86be1e8fdeef859929 -:01b290b9c6c195a6c0c87e9f7f80bb165eadce -:01b2a0957cba3a078c38b2a7e6a46e65a2c567 -:01b2b06248733625b8775e07449b2cc7323d87 -:01b2c0df3bd4811b5f3a43299535d76a159e59 -:01b2d0d4b924be44ef3eebc196f8e458ffd84f -:01b2e029a97842694446b2a2247db6fc7e1c8d -:01b2f0b6aa94a480a549e365ad83fd6afdf477 -:01b30054ce2019f9d64a5309be4643bfd5453d -:01b310eff942e0d6f0c1b421e27cc66ba7a09c -:01b32020277344f0ce32808a2800bef72d0612 -:01b330982d30ec7f92b04537539c73329650b4 -:01b340b217c16238f0e93f663dd47ae18491e1 -:01b350d573952d667f6b4caeb54ce06997fd10 -:01b360a8d6834197a57450b8a0ba533777b08e -:01b370539778b6a9436043a944339f1d833a29 -:01b3807803d008d79c15f94ff088c383a8dfd2 -:01b3900d4b5c291a467c03485a16b9876498d9 -:01b3a0b0d364b88a1156f5d488581fed214588 -:01b3b0f82b92e5e7b8f4ddcdf012f250a1fd99 -:01b3c07264d0d710f486118d68f9cea6011490 -:01b3d0e4308f63cba78481574315e50c808e04 -:01b3e0a74e129be7603409ece36ff53ccca693 -:01b3f06b1ab4d87a8f32e4856a1e2c786435aa -:01b4007a62882e7928957ddeab551aa4c06b0a -:01b410d5efcd0120b2f8a94f9f57e1e377c7c3 -:01b420b55627a8243dd473f5379750b4a68371 -:01b430d50d7aa7919641f5f37899c7384dc24d -:01b440d22ad95e3ef6377c3305053f8070805d -:01b450a174bc585c3a53d39be5ab9865998cd4 -:01b4600fc5183cb5096b8aecf15c94adf05b3f -:01b47089ae0904d76b108b516d3b3bf0971c3c -:01b480ab6b3003b3dbc15c269d6066278435d5 -:01b49080454ae9db0eae4141a7213051fc1be2 -:01b4a054437d7db3b2d9e06c2cc6316a731b7c -:01b4b027549bb6745f4ae2f43aa3ba749b09dd -:01b4c01cebecaba78bd23627a46d23b59f4049 -:01b4d0e90159d1d3ec453af6b03626bb559134 -:01b4e062b1b6dfc7fdbd0a1d82f0e24c963490 -:01b4f07dbf46082921751880958ea53bb2f53a -:01b50003955f18a0ecae0fe366c5224b3541df -:01b510a031bf0e49103219434ea1ceb9f2aac8 -:01b520a93b3bf36c65e886331889101bfbf9dd -:01b530f54e0f227b1f3c73221f842ea7af083c -:01b5406513ddad0afeeb767d220d36cecad47d -:01b550cb14c77106ff6f6dff9d4de5988ccd5a -:01b5600433c37987e8de8a788846ce0591958b -:01b570d21de65b9d35020ead148e29ddd86b0a -:01b5802aa5a959ab24bede9d8c2d31c0b63239 -:01b590ba5cb31a79c32f4b1b947de5135cf5d3 -:01b5a0b8a3fbb84f0c001008ce869526293bd3 -:01b5b09676d88229843cd8ba7bc293df708b45 -:01b5c0a8e393fba6444edb5138cc78496cead8 -:01b5d008b089a7fb2a46248e4add53aaa393eb -:01b5e065df9f1f9eca01a12b8e2c38c394e64f -:01b5f026144293d8b58c46f6f900104f4a69bd -:01b600f7f01b249e477f6df5f45f5a4b41a23e -:01b610b7c1b5dff9393a78f66188f32cb08f1a -:01b620679e534399c75bb57bc4e8c0b9a029ac -:01b630aa07169948f500209a39a1707c2f95bd -:01b6406c15002bfc208c7ab6f8c5eab80dfe67 -:01b650828a54e6792841d820d9b97de5e11656 -:01b660267bdf1196c12f9c2c996a5e285ff31a -:01b670b3d6e3efd3684dc8deb49119bbf510b1 -:01b680ca5c1e83c246161243de6ca4d3b96fc6 -:01b690b097a2a59a330d57a36b5acd14ede17e -:01b6a0f384a5b58208b8f831fddd3195c6c2f0 -:01b6b063728cbd6335e24443ee0b104ed6aa9a -:01b6c00d111a69eda44660ed532d2b47c9193b -:01b6d08d989b0b57b4ad763ca09c68de95d00a -:01b6e049e5955b1e7c39f2081042b5d13059ee -:01b6f0c9d32a015a9f0a1b76c24916a11d37c7 -:01b700c937838271c82b1bf7eda2d9995b60da -:01b7106af8ecc4ca2d5b90ac959db1f2e192e8 -:01b720b752c7131679a25decb27e4962669057 -:01b7302bb0666db44d44a4d6360758663d531c -:01b7407ce648144a984302f3164c96b5c1b254 -:01b750411a13074c1712af185e59b72ed5795d -:01b760670691af4675eb49f2ea98af65253f87 -:01b7704ffa725a027a0f014d2057abb320be99 -:01b78071d8347da5505aa8d560cb606f0af1c0 -:01b790d548db6bfd0aa6ea8740a1b012bc6d67 -:01b7a0c0307b63ff5a20a1e377c74c6220da9e -:01b7b01af3c0119823a37c0716819a8d768ecc -:01b7c04d178185562bf481658f86da29b8fb44 -:01b7d036e49772dbc271320aaed2e3c63af786 -:01b7e0143761af3ed6144d59e5018d0e2dc8d2 -:01b7f0896a344a3d35199a26c0c780e292217b -:01b8006ecb3e87c016e8b04f580a902d9e6852 -:01b8103865ec3c2b14bcedf1c53e8848a55a30 -:01b8209ae8220ff2333b6ad7384f7e67b1ce3e -:01b830064f22769699097e1d4d291e14647c15 -:01b840445495e00668a3e1ed8c54e55fc8689b -:01b850ac585facc94034c0185796254e6af565 -:01b8604d8b57c531b2ba27b0e935d39231cffa -:01b8704140a6ae470669951f6667a2420c580d -:01b88028ea8adfa04932985eababd0f1a31859 -:01b8903e3985d4eced5e49e4f4f10f63673899 -:01b8a0abd2a65477594fdd8b0d12b44bf6d577 -:01b8b04216759c5e1b4e66323257440d059114 -:01b8c026cdebf2a99e595057e5b44630dc66d0 -:01b8d0ddbeb8a6902bf6ab3f5eb95c668adade -:01b8e0c861cd7d412dc67ddd308fa24364ab02 -:01b8f05553bf09056e5aa52ce52207a21911d8 -:01b90085fa218508a9eb7a31b7dbd1b43cf6fc -:01b910ae788901e62366129b99af1eee8e9d7d -:01b920b42eee2e8a635633d2ee478d49d6fed4 -:01b93098df6b90e87c94fb249cf5e0f2ea33fa -:01b940251dc157443809ca7b67305244839437 -:01b95083e3f21d9d81de40d1faed62b70d8079 -:01b96081959d802b81de9cdf9bf3dd6fdf8450 -:01b970c3ef594e0fc0c5d4cbc00a3c514f8143 -:01b980b0e902d0f9c3c55559bdef334dd4237d -:01b990f3efca6f49832bf9ac34ae88a4d3ff99 -:01b9a00de6d756e7c8ada17b2156a997cf54d4 -:01b9b05a8f9fcd7aa15326c6f91831016479f9 -:01b9c04beb1cbf937e206aa24159ab11b39de4 -:01b9d01508c4d83f65f065e3e44e2867bf8fb1 -:01b9e0c5e24120e2e65f1754ecfbd44eed73ae -:01b9f091305260547f9a7d77ef07fddbbdedcb -:01ba0047a92a9fb13511ecca134ceab3289967 -:01ba10696a96db2dbf5f08d4bfb19f4375a7c7 -:01ba205428a4991740ebe35d9fc33918b39cdc -:01ba30dedbb7ffbba16e5cffed5c82a103f956 -:01ba409ce5d929df45f15c7176f9f323c28f40 -:01ba50fc30c0d7d2adc2e7adc34e87be4d3476 -:01ba6001a1535e5123a12a55af9be7689f712c -:01ba709859698bedc7db2f9602bfdfe42cc51e -:01ba80b930521e4afbf2e9020c4e72a32e0070 -:01ba90be36ecdbf6574838d5ebff36b5d22b67 -:01baa03abd0e0dbe25c59ad1adc12c64c3eb29 -:01bab0eb6afad2449db0013c57b4947fde005e -:01bac08c01e28bb1731ee41f6ddc11aa794f58 -:01bad026414a17171361ec68a9ccd2131b7699 -:01bae0ea596b7132e4035871d6ad3859b9ee98 -:01baf0e96a2df1191706f50f7e79fbe26c228f -:01bb002219fbd35327552a605216f0eb8797b3 -:01bb107f41d4c0c5c0a02754b5ee6cb94fcc1d -:01bb20767a3ecdde860123c6428de5f2118676 -:01bb308755e1a6103cfc0d7e80ebaa89341186 -:01bb404304cc4f274377c34b560ec351a54851 -:01bb50f1c579cd800f2c32a78a383561554ca7 -:01bb60e565c318dae3873f58dfcd0fe88a602c -:01bb7099e8d89bb125c33fae08f97c52cc6871 -:01bb80e819dce2dc7c609a5a357de3443999d2 -:01bb902db7581577e99f023f592ccd3cf9015b -:01bba02bb54a6e1003cba5b7cdb20bf94b70fe -:01bbb0de0c35393478f25577ea74beda940bcd -:01bbc000bc2afd117c0108f1bcdd1303667d68 -:01bbd03973a8b91f9caf2970f0c034c4625260 -:01bbe03b86ca226c5ed54b2c565b1cab00ba9c -:01bbf0ecbf7e700c937b49e5e829e269703fef -:01bc00e11421bfab559bc1370bed059b6528fd -:01bc10b29a8eff1df2f6904b4e86ddc77089a9 -:01bc209d0cfb7322160771b005e7b0ae6f35b5 -:01bc30064442b9c46f77c91e68e282c85fab89 -:01bc4000cfeae5fbb9428f0c584aea8792b7a0 -:01bc505db850d6a35fc7f537e0ecb7c0dac84e -:01bc606bcf58ab405baabdcb95da3462a5439d -:01bc708a4006aa7b7ca60fcfbc63f9a43aa985 -:01bc80d1d2055b1a939166c2ba3278d08f750b -:01bc900ebbcdd2d7ae441b315181d6d430b684 -:01bca07a604e7418ace6401e450f98a4960ba2 -:01bcb0e09daee21b694a6dda13afb3cbbbf07a -:01bcc03e5c2d870f98a8c4d54fe893424e7cc8 -:01bcd015d720ddb735c7c862b2f23f70e99813 -:01bce0c68d57cab5756cf697a4c604e8d63d0a -:01bcf0fe51a7663d1c84e3684599b91b8b72ca -:01bd009f1d08c2fe943a2b24a82a3c8d113158 -:01bd103d79bd35205a542e01b0b26ed02e0898 -:01bd20111d85f901255acc302bf473f7e4efc8 -:01bd30cdd32f929d5de76cf06c63a328a2564f -:01bd40916c6b9d4b284fa1070c538b10abf15f -:01bd505c28d8a7c8e510621b187f254fe76657 -:01bd601a8b627a4f5737c3c4bf08877bd88423 -:01bd70e1c7a6c9f66772d813be937dedcb8d67 -:01bd809b3d3da397b5d47e23a5140acd6f3f48 -:01bd90a65c4bdc09b8f307a38714095a521d6a -:01bda0dec01095a72ffe125803c4c7e2a4b069 -:01bdb0245b677d1831fdfd0b1eb9545ab0db73 -:01bdc087d93849f18ab44dc95ea705f41f103a -:01bdd08c8c8fd52d7723c8dbe0d56117a2c104 -:01bde066faf8133e3a253a4306ec40e75f230c -:01bdf00d6e0ace76a3c33b5ecd14faccaa880f -:01be00536363e60110e60228cc5341b2b3a513 -:01be107fd961eb6b623644e98650f120c65566 -:01be20b53c32bb23a5abb11dcad83b01f46046 -:01be309901d4ab6ebb5f6744df5ea2e2f67441 -:01be40396a0e155e6684c1d1f513410557bde1 -:01be50d3d990d992630cc1ef81279e42c61bec -:01be6050352b66f4c29b631fce9c73e8447b6a -:01be70d2941c70b22bd42ed3ce17a2d5ca2a5d -:01be808589002b3d76120593cf510cd588d517 -:01be90fc6c7e0df1bd462790eb2ebc450900ce -:01bea0c4fd54eab52bdbb186f606aff28d903f -:01beb072fce6f5e96a2a0cca27426979369ece -:01bec0a9868674d33678ebe63de9b62a99c034 -:01bed04e327a3f85eeb44d4ac98e2b551837af -:01bee043a5e35b3537ea55c38662b1b059a965 -:01bef0388e0f5b7c1fb4de4075ffb2ee993a77 -:01bf00dcc8e08bd35ef56e84399724cfad1120 -:01bf10f8bf109e8fb7cef82919caee16d7572d -:01bf208ef9c35c86347a9a902507220a1175ed -:01bf30226c70e496b5f74612940d0b9c51c102 -:01bf400f6e168f59476730a3f03e838e8b8144 -:01bf50e10367f0e888528e185f35b21a4af5bb -:01bf606842ddd48769611f652f2ba26cea140a -:01bf70e189ab3693cdea62df1a58df17da9131 -:01bf800d9a88f378da1873fec44fbd1602c25f -:01bf903416f1b71c6572855a2ebabf6edb11a0 -:01bfa08edd8b77ecef16f87784b412f2fa2297 -:01bfb0e0af333a372d714f410bd35fd5d61c4e -:01bfc08d6a6d79783fbf404d388efc2a7f3335 -:01bfd000e246264212363c93c905ed3dc1ec59 -:01bfe0f4b61ac4ce7f6761ce766bde4de59101 -:01bff0e28970c07ea88e637619936053ae5425 -:01c00043b854cd43ec6b5b388e570f3c038165 -:01c0106475a6537e0c8b1b0c29b248c975d460 -:01c020ac5c48ee626ee544654903b9550c5a09 -:01c0304abb5d947c895ff1d440783b66217984 -:01c040aac06cb18779fa0b95b7aa94a845d6f5 -:01c0502e8693c2bc4ce6e72d1eb661161fa735 -:01c060da1e40df4ec755c42e91055043d091f2 -:01c0705d33517654eec3e5b45e820f575b13f9 -:01c08007a36a76d6ce4c2587344193f97b517b -:01c090ed468305b96b81b61d3a6fbbe3cff12c -:01c0a0a184775492aa8502e44063172b63d000 -:01c0b04672913ff5a7e11b929dff33859313b1 -:01c0c0f7a47b6d0761936fa673f17e4bd4ce22 -:01c0d03380bbc1fae0bbe5a01895f394d61527 -:01c0e03292745944da0ca741d19ea33d79d9b8 -:01c0f0d224a5c90452f9d0dfcc946d422bf5c3 -:01c100df955d299a016e1f030d0a60bacc9c23 -:01c1105d3e29890a8056338ea6c3832022ee33 -:01c120ac6bbb4c1b834530091e6abdc2fb6973 -:01c1304824ed5f3e726750b78246c7a7c474b3 -:01c1408ab1db019a8b80308f51b21750974430 -:01c150562481c291bea9ad3d03778ce394d070 -:01c160203eb5695a7dd4ae58cc7f4a359e8595 -:01c1700143d8db2f4023fb3a8c2ceb4e6f982e -:01c1806214b3a2db6e3038621a727ce8ee50cf -:01c190b44b70fd5225836ad41588e7b5a41dbf -:01c1a06a69dd71801293b108bea0ba2664034a -:01c1b0f44938748655797492f454828f58425a -:01c1c0d610a5a67cc870c48f5dcb4911db2a8e -:01c1d06eca6fd99fce73e4d88e1f99026e07dd -:01c1e04de9849c72bf27b489b99c0b81f5c364 -:01c1f036c30dfd1c57779f82d1dfb43217744f -:01c2008e32c7c2da072f332c57bb99a5638063 -:01c21084b3c82ddbf037e86b0d5bf63e333afe -:01c220bcd40c06c42d92899be4372d153beb15 -:01c23063be25078f3a07e271e4f8433437fbec -:01c240010e1d9a81566ecd582f92dff46cd73b -:01c250d7522a17cbbb0b608a710a9923d296c9 -:01c260deb4984d78a027f92a19e15e4cc2781e -:01c270cc091a907c5a71c15fb30c164fd3da20 -:01c2801c21ecc24cb0b4a6a9ea7c290c48ed96 -:01c29069b42c740137798a3a97f0a14b88a946 -:01c2a023e65bd8eba5f9816c4e3eb9fc6af2e2 -:01c2b04c00a04a469106f006441c19b30ebb04 -:01c2c0432055aa74a5e2081fa807f645e30edf -:01c2d065f9d0f1d04e6267b986f938d2ef880a -:01c2e0c631cc8b388017710fe1a44156d9f1bb -:01c2f0d3f3a39c1efee34a92854435615017ea -:01c300616893aa00b410d65cff819d718a93df -:01c3105ed444f894f7a29eed2ce73856b6f28c -:01c3208cd2443dd8d6576899244a76558d38e0 -:01c3305e0a19803a98cc6614ca80431cc90e03 -:01c34094e86acf24c9d7219337326e27f79fd6 -:01c3500395b7bdc057e8fc8f25c152cbb41caa -:01c36055f77768232eb3d34869ac824fe46c12 -:01c370f2cb319893221223fd71aea9f195d880 -:01c380fb3bf4a31ff297147d4e18813980aac1 -:01c39023ad335f5cde40cc55b60f061103d414 -:01c3a0aef9edb1c970027704322509fef921c7 -:01c3b0ecb358dda3f01080b2413c93b0ca79a9 -:01c3c0c803f96002c38cb6b6c5965c657b7658 -:01c3d0eb2210702195e4c19cc2edc95682b2d9 -:01c3e0477a8660da27b21b0aa2aca5e3547afc -:01c3f00eea990a692ac3286c217bf49286885a -:01c400d82594e5fddf52a5b55f46127490f1e2 -:01c410f3e4c07828ef0f1ede8acebe59d390ce -:01c42067b647fdce508104b4c9dd3c1c3139d3 -:01c430402c3f1750430e3d99cf3f5e466518fa -:01c4409047aa42e1bdb1c1d5a2b314bfc4dcba -:01c45082873c71e7eaf52b22092d0cd47c2906 -:01c460ea186f4ff4e08044f0a0da84a17af39f -:01c470328deb59d996355279dce94ba59062eb -:01c4805c7e18673c58b15a92acfdaebb4605f7 -:01c49034770abb340d47de9a2f9f75f3598922 -:01c4a0a48ee690e917eb7ba1eda727394f3aea -:01c4b06e473a680024adb4a02352a74ee851f3 -:01c4c0e0eb8e356612844998262152864d6299 -:01c4d05ba47e68fc2d35111a94088eaab76905 -:01c4e0105ace2413879c658428add4cded9741 -:01c4f0398407935b59d1fcdb59f526928aaee8 -:01c5008bbda78e028c60dc01ef8baa07a8c63d -:01c51072bdbcd57770a9ebdb2e69d22fb5b9f7 -:01c520c85bc08b2f835f5f7020d501f9600b2b -:01c530d72dafb06d7244cbcad4359497829e77 -:01c540dae7d76928290fb60620706c43bd1e49 -:01c55064cd852aa1580e7b973fd9771470ebcc -:01c56047a932c5324028cdb24a0df86f776034 -:01c5704a2900246ed47420815c87cc3c85ce4b -:01c580178a0a9a59888fb210852abe36f8df3e -:01c590d1bb47eb44dcb4fe0983faef467817a3 -:01c5a0783dbda48075327f77fe072c550da8e1 -:01c5b0e6c93ccb38f25b2c830d9614cf31d20a -:01c5c0297be77a51746369ac1e53d4b0bebf97 -:01c5d0f3df3432d883f0efd4aca8cacd968377 -:01c5e0435e03e8f5ac3baf68feb0b5d5bafb97 -:01c5f0af3bde73d6ce7d96f5e8914aa42c792c -:01c60086c11f145864be19352f79e4c7c6823b -:01c610134e232b82c3b25e6ea1c094a6ec51fb -:01c62084729d5e4ad01b0b4959497526631951 -:01c63031aad1b223d61f0d2a3dab7cf8872d50 -:01c64070af5efe8bc29701995033d577adfa0c -:01c6503c8cf4d20c8bf608c24758f0f6b65e29 -:01c660c6af2c3fbaf3f1cfb2de599e8fee5dcb -:01c67061a66231e91962921eae3f8ccecd7298 -:01c680431f62de84dbfdce938714fd2a2ff653 -:01c690a9b3c9e8b4e1d2c69637fdbd0f7f6931 -:01c6a0e6918fb135772e440632c36634c64b17 -:01c6b058c6523ddeb0b84205277dc74134585d -:01c6c0b7581c2281cb99b8f526e0050bd59b05 -:01c6d0b71a60d16f79ea295d2c195881dfc46c -:01c6e03007340ff7e69498f31614b6f97b819f -:01c6f0b70cbd653fa5532ab1a597da181d6335 -:01c7008d12a2708932f7c38f8cf01d69fbeb47 -:01c710f1e031ebcc7b8b0610871aa39c526d6b -:01c7204ac1c117281b8f5537b577747abdec4b -:01c730dfac8a3a20b4b79cb0897292352c4aaa -:01c7400de3819ca22cd13e7de930f892de04eb -:01c75061b957e82f690d184fb5b58017a9eb1c -:01c7607f97dcf50d8948ed56bb7241ed5b3688 -:01c770e9587e17a86c572b0b8a3fbf90b522fb -:01c7802be71c3187ff327a0a51fd57b03c755e -:01c7909316ce74295b66b32a387cb720671847 -:01c7a0f665f531265ff35500e2290e9012efef -:01c7b0d1d0311bbbf04989b0bd41612407c6d1 -:01c7c01d7aa7aa10e8cde0337173f96a438d73 -:01c7d0a61a31f51dd1ea68db25bdfa0ce7765b -:01c7e00c6ac84efc62fff628410384fdb429e7 -:01c7f0382256532f00f108ca19c7757f147629 -:01c80016b9ba97222bee8dac2e17fb12316c10 -:01c810c3275230f3f8cefbe7b42c1ed52a4f63 -:01c820fa158cd487d64bf672a7603187d92f7e -:01c830b0d6528ebdc176f0237843b9fb57923f -:01c840e8d6abce0dfe41d76bf5fd398f7ca4e0 -:01c850b39ce9729c0f2c51fed43627e8562826 -:01c8605a7096123c972f561b239896beac7d5a -:01c8700c4d048a1b3442a05d01a8ff1227b169 -:01c8801e66cbff2a934ae1e41dfaf2506609cd -:01c89029c6d5ddb0ba3e0363168c28950269b5 -:01c8a0900fe2faf89f159b637c914c19f65ed9 -:01c8b0e00d3eb9956b3337ea3c4915301d379f -:01c8c03baee520bbc63e29054a0542bbd65812 -:01c8d03eda542aafb65e3a15459a620955b547 -:01c8e0a6a2035032f2d08ca0f50f9850e739f3 -:01c8f007a83da764c1b54c04e0c8e877de07dc -:01c900f0efac7213da597315301386e1bb756c -:01c91087f28b7644adc914308ef5651af4670c -:01c9203b60f5a8a6b4486a0f4f62a41dc6058b -:01c930d0742c47bf183cfa2cc9533cf984ab8e -:01c9406c9d82a27808490b91bc0e6cac0b1fae -:01c9501b40baceb95c4c60306b6e9e2ebe4dc0 -:01c960d96ea039074442a0b35e0bdde900e8d5 -:01c970522e41fbf38dcf3a6b3187773449ce08 -:01c98036f72993fa21666bd82fe7081fac5084 -:01c990d486af01603d7e7401e0f063e79a27cb -:01c9a09c432d9beec745af94a06847a5f2e651 -:01c9b0122e9ba9db4af86d937373938ac9d852 -:01c9c0b1e56e60d6990576e0e6ff119ded11d6 -:01c9d04c961faa5b21c7a8a7b93dc1816e0002 -:01c9e09d9709e6c8a76bf6383f4901b5e43f39 -:01c9f09a5d59ec3cd823113bb3dd26bb2749b4 -:01ca00d6805a7cdce54addb68cd447f5fad390 -:01ca1093f6935dcb557a2578fea5ca86889788 -:01ca2059617193d14ecba0c483fd8c43145e9e -:01ca3048f0e59a8cc2c0185c4ce4d2106a6de9 -:01ca4073d4c4e177e2b126916b78b0ff17b066 -:01ca5005db006633f5c1ab2fd47a0142a39326 -:01ca60a407061e8aef0a2c3f3707eebb85c3d7 -:01ca70f2930782bf883a4f6b8df804c4320e78 -:01ca80addea49bce28185471cdc3f1b83bc364 -:01ca90e1f290d754073c62bd804b8c3cac1e60 -:01caa03a0b3eada3800ab9bd7b9f5a8765d168 -:01cab0161101af27c23521bbdbee94421a22bf -:01cac01dd70f5491717b727bf560aa208e2288 -:01cad099b00b4380a31d8c67062600b5895277 -:01cae0e0239347fc7b75239450c465bb69c243 -:01caf002cc350d824a77daaca3dbdb1a1bca2a -:01cb00185013ec88f563b3ee4fad02402a98d4 -:01cb10bad2d1dc3ed34c40a8a5649634aa71d0 -:01cb2022685037cc7c60d32dcb47d02091b959 -:01cb30480e21cb2a6bd245b4f270882d142526 -:01cb40fadc222afc168fcc8e77b74980b6b28f -:01cb50efb3b83a8ad660110014730fe9aa48cc -:01cb6047cbce30bf59d5eba086a6fdb2877b1a -:01cb70d78e9c9974ddb0cee1bb9868b367ac25 -:01cb8038d9617e83c9304e4222c56a667176d6 -:01cb90b122fc0ea20c00650b493b1ca2690c8b -:01cba0dad5f851ac4f059d43bc7134a042f1b3 -:01cbb06aae7116488996f957b87a2ddf1845d9 -:01cbc0079d5c388a823c6003f89da678b1498f -:01cbd0e6407b1d63af27f996716840e9e385fc -:01cbe027304cd41688b8559aeff5e9ac634e2a -:01cbf09637ab9e0e6549c3494daa5ed7911a1f -:01cc0068b73514be9355daf4c18de4357ab17e -:01cc10ef00d75dadaa39bcdc6259d3f5e88a7b -:01cc2047d10af3b2d939255644e5f21ab45cec -:01cc3011d005a866e082db75a7f52f3d94d927 -:01cc40cc7dea2f0107593f257e476a3b404feb -:01cc504397c8bd3b8230e1e0629b193184e9b6 -:01cc60e8523143e52a8853b073e12c1f61c227 -:01cc70ece9fa74536cc2090a6129e83e973155 -:01cc803f77a250a4c0a932537fcb9b05e160bc -:01cc9091019ecf2547df9472598bb7c7fe26f1 -:01cca01d1b3c86c8035d3f607f603415354a46 -:01ccb094b963981e20d1b43522dd3468ce2f46 -:01ccc0190740929960ad9ad55feb0c97de3269 -:01ccd04b0c2985db54edd9c6cd67ca91957095 -:01cce0b082762ede15ee42be76d3b12902f465 -:01ccf058074d3c25241731fd0d5a123fb359cc -:01cd00e3d1516fb1fc72e16784cd1d07f377d6 -:01cd10c750395cad566d49e8ef5fc258e1cdb3 -:01cd20836d51c8446bdaafdf560acc53566d68 -:01cd300a9671e7b3471d36826b3e4b39ec9073 -:01cd40e85b9e48a6a1b2316a6c0a21439b0c90 -:01cd503a023c999e3ee283ff5d1cbc21598701 -:01cd601c4da723fc1b78c8f05fe4ec6b7d92ff -:01cd705378d362afd1efa042c2f03220927da6 -:01cd805aa7898974c454eaee127aa75783bac9 -:01cd909e928a2c7f0aea20d654ae15018551cd -:01cda0d2ccb9b7793d4e6a09dc561bbb806449 -:01cdb0553e9cbbc43e6744565801d1cb7d1b49 -:01cdc0973d073143e2e6e79563008491bf2628 -:01cdd0cd94d7735c5f62b573e2ce207009f741 -:01cde0136d641d05c1a11ffe03ba3545372413 -:01cdf034d50843fc5ecc61589381d82f237cb0 -:01ce00f6e017b606a9217545e82170dcdd0747 -:01ce109a682737754cd6a5506b1152540781c2 -:01ce2005f78e5324c58e8610410795d117a9e6 -:01ce3077db00cd5b274af132a2ab58badcec43 -:01ce4086524de80986bf9f1bfe2dc6581d14ef -:01ce50845cf2fa59b47baaf9ed14b05591a60f -:01ce602bba233b3cc3b9ffdf6b8fe6d2769a89 -:01ce708e2c38d85aec295ef41041bb658a5ef7 -:01ce802868e23b0191568d6f3292fe74892e05 -:01ce90c3307e0f510d60e0582c125f653a4f1d -:01cea0e3a938fd3d3ba910aff1f883ed4430cb -:01ceb0f126239c5017a92a1df43997b75a6f34 -:01cec0bcd7a9548df2996071ebcc5ba4d20c6d -:01ced0a4840599d9202d72ad61306dad41dcce -:01cee0eed3b85e02aada512541a7882bc4c2e6 -:01cef04678062b56e8b827999888cebaa996c9 -:01cf003478f69c32c16a5709be0b9e15095a10 -:01cf1076cc1e4c23ea120cde9a3dbb8888d925 -:01cf2072978dbd986e8cdbc4ce07a2dfdde4cb -:01cf30c7b307fb402338f935e6cbad28326537 -:01cf40d5b9190e63ea6a7746b50dfb8a1135f4 -:01cf50c8b296aa466e23e0fbf641e41320c5f7 -:01cf6069c1adb9cf24b25b25d8625297fc5f03 -:01cf70daf4321bc9a11fd8531d3e473ec0ee55 -:01cf8002d250ed5471b0c6dc9389e9fca46246 -:01cf90660e109825aa53af00394a9d9956c021 -:01cfa02d42125ec75ac87f57d2d8cf00e2753a -:01cfb0e32d2c5342bf9dc217aa33a4faf34e48 -:01cfc05c1f193ae2166bdf36c7f9e503945614 -:01cfd001a74d9c8a330c166d8ae9924cee9523 -:01cfe02f720f01d3167d88454a9679da833700 -:01cff08af4d85afdc90427bb7a5911f893e0ce -:01d0001bc7d66d86d3644de587a7e111311596 -:01d0102d31c80a9a2a95e2494217594a0e101f -:01d020d001af6da045c9ea1b47c2059924859e -:01d030c7a16658fbc1e3a0c8b1be51cee822cb -:01d040d5b01f1944d72577e8eff86c460c180d -:01d0502d5075d82a719c316479d506d85d4891 -:01d060938e3aee190a557d31955811291adfdb -:01d0700dc085f984fa4e2ce4ba2051b6d45ed2 -:01d080b6d359abfdbcb73b7c07006f686ad2e3 -:01d0907589f39115680ec643e9b4daa540f0e3 -:01d0a0e27cac48fd51574d0e4c463986f6c48a -:01d0b0c5c71c48786a0978a7df3039c147f68e -:01d0c0824224eaa6c9a86f95d05290a3edaf19 -:01d0d0bb09a118b472b70fe38e21463e92a3b6 -:01d0e0ecfdd628803e27ba40e7de6a3df28507 -:01d0f073298a996b44df10b35e309da4ca5bd6 -:01d1001a7e214ae32c2967deb70c764df64aae -:01d11050ff4af9a17b340a115ec620ff0fb555 -:01d12051c98d08928ee46464f760d2c5d02cce -:01d13094dec807e37b4a65f396b32c88a85201 -:01d14081bdbe4e92f9a73ec045a6e6f5147608 -:01d150080318206ca87475b64e9f72413210d9 -:01d16091f8f9b86ad77b3983109e3c37d15b9d -:01d170a6d3af1d17782b895bb0b12eca04392b -:01d180847b25e6aa711dffb9a379f312fe314f -:01d190625ed6af2808bfd9d580a42b167c665e -:01d1a0c7e764a32e525fdfa7bcd2b4d32a884c -:01d1b0d7292b2f5cf84ca0378eb8783ed61169 -:01d1c073835d80e7232f5d59ed1e25102490e4 -:01d1d00c168e2f0dd9a9263f73cd609182e4f5 -:01d1e002dc439852b6abb2d00825540d415cce -:01d1f03c8599d74418e9091fda9651bc41146f -:01d20004606c62f55c625f983c8784fdcd2e87 -:01d210b870b8a15b525e70699a44d667467080 -:01d2204fa06a6d6b490969c9c0699605e48d19 -:01d2304c09b605344a600578ca6cbf704283bb -:01d240dfb07fc78daa740e289d84246c9bdbbe -:01d250cf1e3f80266ec94e1dfb0629a1309367 -:01d26086f6fa264278a87efcb94b8ef58f85d6 -:01d2705da9ed3f9d6ed510f257e36e27913501 -:01d28093160ec6de989df7b951911a230eabad -:01d29016564c8ae1296f868df0f5dd85fe39ea -:01d2a04700e511be8f49b26ba0fb67a010d98f -:01d2b084f1a6495eb31b95c9241de25db99876 -:01d2c09ff820c5049da44aededc579bf3fe753 -:01d2d0bd9632639d58d9aef6c2173f626fcde2 -:01d2e00690270b8f801a5855b8307702933876 -:01d2f0b073119b5f2c2000ae10c9bfa8b14dbd -:01d300ee3907252ac8d151cb48e9e70546b954 -:01d310a065e7a657de468d8b3d55293480ce9f -:01d3202846cc93cdd33b660f785418892bbab5 -:01d330b816ba15fb5301d0fe3d7136142b4388 -:01d3402fe69c6280a4e9b3d9a379953b44ec9a -:01d350f203135d9a405c72665dd9ca6353302e -:01d3606e99fefca66ded0f5f7db3c44875c8fd -:01d37071c78a65aa365c2dc8046fce4ee8949c -:01d380e1a42b57ea798673ea010bad6712cfcf -:01d39003d4beef30b0cc7b8e5a35cd69da0ccf -:01d3a003f9bba9b44bf7bbaf0ac9f28fbd9996 -:01d3b0f0c1b6e23c27cc649bdc786afa835208 -:01d3c0caa81fc0ed4d44746abfd6c3f2d21ea7 -:01d3d08605b202e6482d824cfca56359bda278 -:01d3e0cb014b1f28a306edf3af610277b53a08 -:01d3f00d46b656e61c1b69085e8aff54772a8f -:01d400fd674413d4bdfb1fd21ccc541b0e7a84 -:01d410e502867a2cd88a0501d897a134f0146c -:01d420690cf23996e78610423bbf11675d6d4d -:01d430a26d9d65fda2fd99fa143df1c830e09e -:01d44090aef9b3a6d1c15209a93eca590774d9 -:01d450df077978406fc6d659b837f74bc48f13 -:01d4602ac37bd36285281451cf1c1a07b6f179 -:01d470e954c994684a29a39c47932a76a5b5a0 -:01d480c16187bd8db248c993e8fc06940f7f5f -:01d4908bec8d2af69ca91bac9b2472037f38fa -:01d4a047b0eeb2ee662f8f25b8e61371df1aca -:01d4b00c2e6a3a2d477d27ec3abeaf35249311 -:01d4c08d71efb721a38309d9260c2821bfc762 -:01d4d0366622ca63f1e58b1d7b04c3840879d3 -:01d4e0dedaa92f7e5a65e9e6088dec70db06cc -:01d4f02465b2bdb72d8c3f4c36b307464ca6a9 -:01d500e5e2263a0a7c44c8560a8b76d4cfca98 -:01d510ba4159bbda7751662cf9bb1c5c6adb5e -:01d520c4c1944ebf1017ca437d31793017b1a0 -:01d53024b586b19b3ada20c171f657fcdec638 -:01d5404b24daf06882f28957091ca0465763d3 -:01d55098d736c8f0c4462f4c68093f13035026 -:01d560723349d4d9c4adc987fe7de15529dc60 -:01d57073f541d2f4933a1273f31c2c1cbada9e -:01d580cf8502fc0b52f7409363116014a7c376 -:01d59087a5d36038f45675ac148a77506898fa -:01d5a09cda79ca641345381c9d680aaaf75ed5 -:01d5b05050a0ef5e8408c258aa7563808e76ab -:01d5c0292b3e674e72cf902239f26880c05a79 -:01d5d053c8717ac4d7232b0aa13a9f83452f31 -:01d5e06e5d3ad193c6c8fe7b9c7715ec734197 -:01d5f0179d710609417bb6213c39cd90bb74ab -:01d600b8a07245ed796b6326ff3a16009c6fbb -:01d610c59afed4e4d32c17bfa8c8089738c6c7 -:01d6207c5ee25e43eff4e148c6336733b25b07 -:01d630ddccac14480dacc8eb6d4572b4c664ff -:01d640cca55d9d37444a5567aee14ff26760ff -:01d6500da9517ef2c2c51bb36382d0b16c188d -:01d66030cad5dd62b529aac6eb6f756c7f7b68 -:01d6707bb97250e0c6b9d962e98c99e10cd67c -:01d68031c54b828420e0d2e1197e98e2fe5b3e -:01d69046704ea0ffd4ae242c60681b873e070a -:01d6a0ab289d5003fd1b47529a569e202a37c4 -:01d6b0e849348ecbc1d299ebed73ce5e0c02b4 -:01d6c05de258bccb894527cf8d6d3ed5497892 -:01d6d0e14cf33f02db456763dd4478e35297b6 -:01d6e0a636c61499093121338e6b928a37d282 -:01d6f0508ffad0f5ffa2727aa1e3c3abad97c1 -:01d7009ddb3fec91134e17e5582c5fbf8e5553 -:01d710e9e9564ba5ca2293428af13788ca544d -:01d720e374e1008da30bc9bbe9364821c14c7b -:01d73071b3c1469988bcb4ae5e327b7c561b81 -:01d740141cefa2c7d73e5876a1f6a80bfa9030 -:01d75091d3d38c3af23d623765cdea0dfbbb76 -:01d760bb0385c9a579005a65c7baf5abe1823e -:01d77072dbb6287b7a9714d96023b8cd2c91ce -:01d780e05c6090600592f0347b62901fe56ab8 -:01d790e6c2e7b614b1ee4c6d9d9692f32561dd -:01d7a097fc8ebf23b390cef07aeefdfa32b7f5 -:01d7b05a2e9f305ec3c025df8ad85e4421672d -:01d7c05fe3576b0e6820c83a2932d9d251928e -:01d7d050d7f32fd5a2797af0c35f9e609e6bd9 -:01d7e070974eec748b3ac1d9027bc6e63b1795 -:01d7f08f81d95bcc6f871d6ab27f51bbcec1cc -:01d8004157957eb9fad7ccbd56b2deb42c0deb -:01d810624610128fec1807303f7e00fbc13caa -:01d82053321b936bf65f3b15276f12848d272e -:01d83015a6bd6f855fe87fc33ed427b774c3e1 -:01d8406434ed5de4ebc3cf37f7c96db6c5dd9f -:01d850f9386fc3c6f7dce583eecd8fda9de8db -:01d8604e85e38a6fb760d1ca078937686b37ff -:01d870eb8149db423c7af260f190127fcb7f9c -:01d880a6b6ac153d265eeff23accfa5d7aa163 -:01d890e230ceb2a4fed0911dfd6e801453e038 -:01d8a0c25daf3b03404d8f96cd39eeef8295ed -:01d8b0acd7769e1c1ca0bd8eb0d0f30ed3e00c -:01d8c0652d073394e472dda994f412e020305c -:01d8d03844562e89121284355091cb58ffae68 -:01d8e0ffcb3fdcdf4e83b9596260a24590986f -:01d8f037cb36329e8710a1bd2891c01cfa2e8b -:01d900cf1600539a4121ec318258dec70edf61 -:01d910bfdb354aa3e8a3453185c2583a6e216e -:01d920439d201a3989c3fb40666df68f4ca395 -:01d930eff16f77b186a9df3e875d2f89ad8214 -:01d9403d2afe07853ef4db83c1b68b2bed04a2 -:01d95091e6ae9c3491d918abedcb75fdacf6c4 -:01d960f742b8782f6f54fa581b9c2463e9419e -:01d970cf26fe15ee02c11c8fdb10ef2439e6df -:01d9809df6e6f12a5d3e4f87b256ca76284e39 -:01d9901c4e41af24e66bd52d7ed4b44ec75a24 -:01d9a0f0ba999b975ac773b07c7330a581113c -:01d9b0f478a51a02dd6cfe9b8c3f691be99939 -:01d9c0c7287f58162e43582f234d2fdb4d023f -:01d9d0199281f8010ca0831d3eb28dc1a2c0ce -:01d9e03791f6b6e7382216dcab97eea8fbe70b -:01d9f0a396f2cda05bf0eac23e66a949f0096d -:01da00a0c464bf60d3a2df93e55bbf73252365 -:01da10991ba9a5e3cc1cffb67ecdaa777fa7f4 -:01da209aeb94d42024bfedec196d16fa6dcc0b -:01da303088920c0cca8647594933e68750a54e -:01da40f989b09ac801dbad4b3b1acb32532e89 -:01da50b744706ab36e9d74238e684fd756ea17 -:01da608249e0b18105dc8605e53d6ddf307115 -:01da7045283278fca8bf3e556f8cee69844f70 -:01da805673a547949e4e8644d294b2c6e46512 -:01da90f266c4532de437a224cb88835919f321 -:01daa0623a771aaa276512f870bebb23146659 -:01dab04294cba8d059d08c385c306602114e4c -:01dac0dc4818e1d437f7c5a1227e33d0fdb1f3 -:01dad0869abda0f110fe94f94bf732095f5320 -:01dae0117216d17f9efabb21638c3b9566ecc4 -:01daf0735bd48ad8f2fc0b9ce5e4337031c2ca -:01db00f4f127865484eefbbce8b9523d8198bc -:01db10419b873b776522f1393344076c132b0b -:01db2052aef4ac9dadbbdb49d119ffeffcce04 -:01db309f0b9599d5307a11dec9f81f4cbe4e7a -:01db40bccafd8b5956e301c9b064c06fcac3ff -:01db50bb6abbc021145357eec9f6d11f8d6efe -:01db601eaf46728f0738fdfa4a953690c59d9c -:01db70dc8345b096002a29d777e53cfd04a373 -:01db8014430245acd43dc9b75ba93d0b5e64ee -:01db9021a0a4a105c5fbd4080f28cf4529edf1 -:01dba090c3a7820778f711c851eb9b1307ff74 -:01dbb090ab45bec375d8776748c00bc542c85b -:01dbc00e704dc0e8576b52fb7e9822128dcb3e -:01dbd00b322407fec741cbebc48bdf823f11b2 -:01dbe0608f1928c0ddb6f4eaee263e46c6ecc9 -:01dbf0f983d9d747edecad069e4ec1f132449e -:01dc00c3e14ce696ca6ac1b92d0e0163ac725d -:01dc10dcdb197e3799fb61f31a233541c7d04e -:01dc209c41b75983b0d81a2ebc27aeff9876cf -:01dc30c86ce17cf217c297e894013cb997b9c3 -:01dc400a8c2e6b35a79bea643e5ff4159af993 -:01dc5034e544c705da884bd2b7e62ead4ea1de -:01dc60f0fae376482524246b94e564e6a6447d -:01dc708fab90b26bbef1b529badb117b40dc99 -:01dc80ee75b53251aaa582e99b5110e5ce22ad -:01dc909dd9576109a8514ef85d5eaa88ed6d98 -:01dca0e681b847071ae0b4d6b59713f7a3e390 -:01dcb0f0ec95a885e90c352ff1203d4634b49b -:01dcc03fd6f550897e14b2d7f09ab101c617e6 -:01dcd0826f1f0a6eac5adfeb287c768f09b959 -:01dce06f4535853a0a4a3704355b547601ea13 -:01dcf0d183648d35343f70667c67d6e817238c -:01dd00748f0cd3367a6c91549e60250e3a138e -:01dd10a0fda0fea62f6f19967e17a295891e88 -:01dd20c1de2defc12b3aa03e6b336873de71c8 -:01dd309da36036b2d460044d272304125a4904 -:01dd406a3821447dde5793284e33e63acc489e -:01dd5085d4c8e1682208d51f8f119b4a86aa24 -:01dd604d7767c5a746989de0a1980c44da8b0d -:01dd7018e98c01450af6a441f7fc7fb9cefec0 -:01dd8028f0b229ca4f2ca04368c349b92c92be -:01dd90522f0aa852f0370d856e1f7152dfa48c -:01dda088d416630a477dd6034e471936711129 -:01ddb0b84d55e7358d205bfd1038c1d40de494 -:01ddc0a603aac859a2f6c82dcaab771e976c67 -:01ddd0722d94bba01a507fa81c69069b69598d -:01dde0ce44d37d039f7751a475f556fa716cf8 -:01ddf091fa77c2e2dc838c0315cbab06850ca0 -:01de0056096a143f02e0531d18c40ea068b59d -:01de10f266c4fe16801a0ad951861162451f3f -:01de20dc42f092633f46eefed67d040f95b76a -:01de30ac9514bea553e149446b7e552aaf0a62 -:01de4023089d0c286a03c7df628503ca70ba63 -:01de501c44608c1b196f7a658e6b412e2260f5 -:01de60be4e40926031a2f51a00c996cbdd93f0 -:01de70148cff5a1a45d127495c1038b5d48b76 -:01de8005d2ef2ce9ca42dedf259a27be6b59e6 -:01de90c45a925372e7c7d3cddd508b3b5509da -:01dea0106246d9f4be241c9a37a855b3c36efb -:01deb02594df940737cea8f85573e3f8461f49 -:01dec007b6e361512e5dc5cf15c0e05c4f2430 -:01ded025d2155bb47bd0c044661ddf7c7aa52d -:01dee0300380c7d7f8c049d5bd7d0e98dde9b0 -:01def08f66b4e4292ffc7bb149d0dc5d6909d2 -:01df003705cf185b7044f5757f60bab1a9fdd1 -:01df106dc4895387c69bc2758a6354b19ad330 -:01df2029b599acb188744592a74f794e5c2810 -:01df30d9a76c4a9feabc337a1ef43bf092c096 -:01df408102dd1455fcb90d53707cb1fbf77d1a -:01df502e5e024e5964b9b8f770e10b2ddc80a6 -:01df6049e006a023745d5899b620ae5c1d594e -:01df7040a1caf918466735b8eedbd1a733cee2 -:01df8062a46bab85d92cd742d13c95aa3e928e -:01df90f6e1de1d059896673ac7506c7550d539 -:01dfa062223bda43c2bbe5141677d373d5af9b -:01dfb085b9db6bf88caef9c9cb7bfbaa4cea34 -:01dfc0f6553545e496c7885265560ea1b9a893 -:01dfd0749ba0e27a6fa02f0f26e8d406d5e8ed -:01dfe0d93cb09796c914915ffbd9af67cedee5 -:01dff0c8e9979e89142cfc6b5356107c543b12 -:01e000391f62ae10252793f5623d093206d118 -:01e010cf183597 +:000000d691711877307a88fcca1d6e95b83118 +:000010b3870898a777d43b3de0bed0cba8ac48 +:00002072c3958e801acd6c4ad1869276b017d1 +:0000305294072be0ef26ed6662e532144e53f5 +:000040066d547a13c44b5487c37b44e02e33ba +:000050a8d16dcce579c4534333055784b9c2c3 +:000060bf5b6a2c38228dbb288d6267030f2ea4 +:0000704231f629c8f038f21d2489730510fe09 +:00008014d2f5a1aeefc9b78acbcacb665e5203 +:000090b41a26b444d8736e89ebb5512b11f2be +:0000a0730c42abf08c5ee5fc87b17ac41487dd +:0000b018d883dd532f39b90a4bf8b98dd65451 +:0000c0b751d5e9e0801ec1c04acfe0c3ec8379 +:0000d0e021bb6f8f8bf99e347422c17a027efc +:0000e08f8d633585563ecbfd9bcdb719239d12 +:0000f03c2a08d50f65ab33b69a2d1ba6e81358 +:0001003e7f2ae374b94033a070224bba4932ca +:000110c5800dde758b04f703279f742823848b +:000120a5012b96b655d5c433eca3de33923a39 +:000130a9a157a47849e016f5be2717ac2e7bcc +:0001402318202e13522ec0ea357f4b02b8e31d +:0001503fb0bfe38f3b0f25c10da4e8323987e6 +:000160c44759aa275031d6f815b37b07cb5e86 +:000170b8e68c12e82e9728a6a06da2240790bf +:000180b1c084f208c4f06b75ecfc0173a4b325 +:000190a49dde300548bce0cd1b35403d37a7d2 +:0001a0a5048acdff56cb67ec0d6df2bf7bc0aa +:0001b0e6c05a2acd2d7d2474b1cfb38e95b4b9 +:0001c0edf41c02614d5b580bb952fa0831ad31 +:0001d0d15cd0058455850bfa3b5650a3a5edea +:0001e0442203a3dc67150df77e1ed3cc3a72bf +:0001f0cc9bab049a5c1342bdfc6a732f8790b6 +:0002001981a03a02e3e2ec73864b6ba229d169 +:00021027a7a81fee89e0602f6ad8d3c9fbd842 +:0002208843bf4e69e488f8c067a786d8270e5b +:0002303dd89f6b0c29f46127e342d1757e585b +:000240c043f96d74841179873b6fcb0e15d3c3 +:000250b5df9e1d041d86ab75355ffcc7ebc42f +:0002603fc5d664763298fb2628b46cd2202a70 +:00027097dcd40277f8471e9ae92520d922da1d +:000280a156f6a734836fa77d07acbca90a92ba +:000290da8efd4639c8943d735e33e346d97210 +:0002a0fefbb9c4c927fd5b9270768f1637ddfb +:0002b05241f898dbaa025ebc9ac208d600ae67 +:0002c0d9832d46141efcf0f39a4bb4e79fc788 +:0002d07cbd421f2f2032b4bf25140f5561427f +:0002e06fc963f587c20d5893fd254f8184baa0 +:0002f07edfd3d5aac9209b7d28ca16455ef76b +:0003006a7efd73341eb4988b915372a7a59b94 +:000310d5d16f6bb520220cd2f9ecf2ec96e4d0 +:00032032715bfcbc660188275216fb4190c10e +:00033048475c895fa89b12ee3d244969ba588e +:00034084deb8bcd853ccee97d9573928a7871c +:000350eb36b62365e0ff1c4c3926eed611395d +:0003604d5b26bf45db8d9c03f7e175f6d03bd7 +:000370df89d7e3fa22e2edb7baafffcb667daf +:00038067b2a7cd489d00e82d8f533499905758 +:00039001c9614fd512aaa59939067ade1f6bf4 +:0003a0e618dd140cfb36fe65a700ce4b559e91 +:0003b0b83d066018d60e5d34f59bdd729d67d4 +:0003c007a94df8a31c1fde93299e48f83a89b4 +:0003d0c19af85fc139482ae3512a6a63066c6c +:0003e0ec676596e9a6fed899da31d2b65a9d26 +:0003f0dcec26a38a7e6f09a2330b0054c50fc4 +:000400a7a103def62a6d708692a42cb2114d8a +:000410fd2aee4f640f5e7479d1f0648c3172b9 +:000420b9f5c86a910583bfa9af13538da702bd +:000430f0b4fb0d4f3663949138ba4d10abe275 +:00044040f112c8f3599e12bd447d658a8c4235 +:0004508d99edcf7dfe5d61cecca0f34259de4c +:000460adec195aec773bb13a133760002f02cd +:000470c2309783f74cafc419c02f22e984fa42 +:000480b615b070fc1f2e4b74c54d65aa566300 +:0004906f9a51eb969ec11e78ec2032b7894013 +:0004a05537c36e7bdcc9c3957d324992085c2e +:0004b072c6d678e10f81ff2605d8520ce38bdb +:0004c0a1a438610335e4e3f68299a3b1eab173 +:0004d0e2e756e85a5a3afa5617299485ca4717 +:0004e0de22ec916807a7bdf91663d3191434e6 +:0004f03753ee5a9840cf9eba23f5924ba7759a +:000500e66ac8b82e03670240f5206dd4483f62 +:000510ce5176a3d7272921c2b2660d457e7e83 +:000520549e8fb6593b2d90d84045dfc3dd28a6 +:0005304c51a79a34be89dbf4f166b244125c80 +:00054004f47b4274af6772c9e4d41b42cf6c9f +:00055095a66a974353e243ebd59922bf4ee75f +:00056068fceed978bffeea982ee34893ab7a05 +:000570f0cdcc67275cdd9c442528e3fd612140 +:000580391fd016daa4359f4ed2e9fc0321b49a +:000590147d3a9ff2025280df9272f176c00df5 +:0005a0b1b5449e2d7df249c3c2930f93a7a877 +:0005b03bcf017a7034a3f1d3919da693796344 +:0005c0f233f0e49ceba9d177b2a267c2e3c145 +:0005d0b12cb112c2ebe6b20f68443557195f3c +:0005e0f9f83ab8a1ce29e5718dd2d89fb3215e +:0005f0133c6ef25774694325880e07126ce180 +:000600975967fb98182eab5a45551fb93638e5 +:00061045170d9ab697ced3cc205eab8f22ff46 +:000620c65f370c7c6e4973423176f4309847c2 +:000630fcd69167af3c5c2b2d742ddb01444da1 +:0006402b2b6ccad2f6914ec8b0a44b1fbd6bbe +:0006501ee01f03ce81c99f6eb4414942bcb9e4 +:00066010d8063e67089ef35b0391a22c3740f0 +:000670c9d2a85e3baf0b3bcf22a11799497301 +:0006807aacfad88f35ab0c5cb223c185a93925 +:000690302016c6de36c649ffeb2e5b3f8576ab +:0006a001eb5c3d2bff79bdb56a169a4310ab9a +:0006b06a351644f6cdd0a32f80b8403f234159 +:0006c072b7bd5282065d9fa68afe8c695c7d8d +:0006d0091a704965cac2e54abe7625fdad4119 +:0006e0bb9394ab9bb9abc4722fce827d614223 +:0006f02f84131da51523f47503138d0fffd741 +:000700840dc45f2343962c7df8ea72c7c600b0 +:000710b4bf0e9072bf06c16f97bf2d4d77c33f +:000720a9d5598853162d202c9abb3f1462507f +:000730c76a1416e4d9b4e7667ab4ecfafc1fc9 +:00074011c7cbdac3481527f1fba3ac5b27cd67 +:0007501d9a0449d8addc4741d3ba4cc1e00c6d +:000760e6d3ced52af1df0f54e6b276b6bbb124 +:000770280e91fb2e4fe47f03c92682a0f5a303 +:0007804f8b1255efeb8b48af074b36f213fb20 +:000790b15941ab56e9804cc1fb856e2d263578 +:0007a0f88c817be5a8065fd6b12f6b08a32975 +:0007b0ae0d975a21fb43862e6a5dd8f209133d +:0007c0f2be6d746668f7a6007b5fd82bc10a3a +:0007d0cfe32930c8d66ee0e72076c071356a43 +:0007e0aae9168ddd56609e162abdb1438c62f4 +:0007f0f0f3c259063b60569a9bc981e67ff53b +:000800267d5f4071f1fccc788935932e739102 +:0008108cc8a78fb7676b8c0ae3190dd1944da1 +:000820b35d567893bedc2a721e29966da9c8c9 +:0008303c07b0629b3f6159a34d03809e472c02 +:000840f0b1c6387ae5379b73ebc16a15b17cc5 +:0008502fa21fd4bb69b9b6e604d07ad420bc19 +:000860d8f780895d7765021841740c015146c5 +:0008701cf387bbded91f0c3d7b33f5862fa820 +:000880eaf422bb69c1b34278f33dba9a53d39f +:000890fd092446a046373818c46e7bf0aa604a +:0008a0c241c0e88d9af1d1d9ddd0a76851cb00 +:0008b02cd9e53c2ec902f5b7a0a4ac034a21cb +:0008c079fad05771dba8f44f79810acde4f814 +:0008d059256a8bbfaa6cf599c83633d0077ec2 +:0008e0ec2109608eae99a69371545d246eeb9a +:0008f00e070c5df4ecda26491c13dace2473ce +:000900c7378710dc9ff92227964e90fbaab87f +:0009108e3a2d5f01c9ddd3fd601a704ccc3ef9 +:000920489f52fa6538a513c6646e16e524b988 +:0009303c737d3ceab84f2dc8d4c07e195a065a +:000940f18a35b73ab98c6d5c6e9b0b8aab3f70 +:0009508752b153bbef1bed9fc73173a4678b3f +:0009603e59e9e7f77e450717313178c57295fd +:00097075ffdd362b1f6d35cddfdb0856363026 +:000980a2c78e407fd07a4d69c31fdf3486246f +:000990568e76e4f9b3c86a6e35cb42e3dfb6ed +:0009a02d8634a85cb3e4e049d4ec1ab9df6614 +:0009b057e44e22a6a74249abc5120d65d1cec8 +:0009c01eea8a09926618ab1e48edf0fb96f5f7 +:0009d068500029d2366102d97b65b478cfbf94 +:0009e0f076a6332e7a31439019da0401faa655 +:0009f0660bab4bf8ebb6c99287318e8f1ab7db +:000a001c14085f763ec93203820e5fc2062d8b +:000a1050dcbe5b50ef6a6f413aa21c48b64a22 +:000a20109da0795886ae7b73609733c4ba25d4 +:000a303a634aa55c8b517da3ec6a181152f2e1 +:000a40813659bdec54e04ac7549b81e7d18089 +:000a5084e2633c3d990f655846a8b4a360c686 +:000a60c5689e0b8906c9e0196490d9b5967bd1 +:000a703d2b02e1bd493ebd9093535b719a68a1 +:000a80f0e49c3a68016786d66d8770eba246d8 +:000a90c90ed99c8ab2079da34ab692c14547a8 +:000aa0d9d5f645a1d6f6922cd514b2f5603603 +:000ab06bfee04649a74ceb704ece815590eb80 +:000ac084f583b5e927c407247fac41dae3487f +:000ad05b0b7892941a1584b585d8f82c403b4c +:000ae0b5fce1de92fe164e42b344ea0e2a939d +:000af0092ed69d8faf11c5f3550ea4437bc518 +:000b00e3f3963afe12eb00a0b40b72fb2e7a2b +:000b10d6859e835ccaacadfbebaaadb8d1b4a4 +:000b20af7d611ff54986b87e1d0b643060e6f3 +:000b304f9465d2a53d0bb725e8adb67b6c20b6 +:000b4076632906836b0c1177d66dc60436abd4 +:000b502b38c9d0e732fc5828391e3f5df5c715 +:000b601b868d06dbb577774f7f323b6210d6b3 +:000b707485688cc7f0b91323b208fc87160d22 +:000b80c5b5c8865203a35acd7703196e4db2cc +:000b902cda4e23c6912baacbafd6a9c3e7ec7b +:000ba0abfdd95d9a2b4d64d19d16a7dfcfd8b9 +:000bb06b3b37b6a057de073e2e1132a801dfb6 +:000bc0b333a82b564272b5743be8caaf47bda7 +:000bd0486c27872c0aacf3ad32623a98e3c9d8 +:000be05e0f49cbcc81a9cb7c4d333d5efa4d7d +:000bf02a93e362a58c005fdafe10987bae27d7 +:000c00996ce2456f18daa26623ee7c753cdb07 +:000c108510206117863e2c9a523ab5e5c9bdb6 +:000c202174e9e5b3bd4a881e40baa416566d06 +:000c304259a2262b9aee9f2da54624d81e6a7b +:000c404f8ea710c847643d0d4cb7f47817c5b4 +:000c50d65ab3f5e2c109360442d1ec71000ed7 +:000c60c5618acd9b8570358a0079da12e89971 +:000c7002d64790e13b1315b763924de33e13d6 +:000c80166d8e0c88f4290bceec7a45d1862202 +:000c9052d5f7ce27262fdb0fcbec047f42de71 +:000ca0d543083011be0685c518fc6dea639baa +:000cb0373fccbb1385cf5e0bb2cdcaed5c61f3 +:000cc026f7fce0cf46219f5bb34466c9b35bc4 +:000cd08740928c26259dbd10bc1d3e2a21e8a7 +:000ce0599631bdeeda7f7c4985ef187e80b72e +:000cf05f8be59d07d16c24d0c9ef7fc6e87eff +:000d00efbb2bcd1c33dfd6edd81cda092b6ff7 +:000d10014d667615a0e37f599f24dfcb08ff74 +:000d2089c875131e3d8b6eae5dbc7b6166478e +:000d308595e9c8cdada3427c15fb73a08fbf9f +:000d4015578957ce186731c296ad798e848dfd +:000d502f3eb0f01c6329252228e09e6f5f1a2f +:000d60c2c83ca6bbdf68ee0d91ab9bc00fef2d +:000d7044332f90a9f4b4e2dabbcca89ead22f1 +:000d80270604cd9a921f98a0c408d1a5ea73c5 +:000d90d951ac0aa669411335873c67c81d6707 +:000da0f5fa72105e15bc7ef6a05b2cc4819383 +:000db0839cbbb013e8dd24de2820b01d7960ea +:000dc0680486a72c3aea26a6b7830e124c8f1a +:000dd069432608f67332574697508903eebd49 +:000de04e4fef74a82e7a4d529cd1ccc246d24c +:000df0696ccae16499e580b9fde16b9c0ec74a +:000e00308c18ed8b508e47314e1c1273a9297d +:000e10b447c61fc0fe2f9f5e2dc7f6910b3eb4 +:000e2036b49fd81f671bea2cf73fff094e9db4 +:000e3045ce05f831ee4c47c0d89005a5d2e0a0 +:000e407ebec741127d4967b646b5d2dcd2cf87 +:000e50266aad54f39d450ad728269b3b8a8bf4 +:000e608a087262036988022993c818ea61ac82 +:000e7068c0795af9a260e369f853057b81080b +:000e809b4da0b23cc93e9c2e20efccf1cf90f6 +:000e90094c7277cafb1c0b3dc21ee267ef2409 +:000ea06a74dd2fef350b00c54bed3e8c020a33 +:000eb0a6315e02b3068855cc633436b2bf5897 +:000ec0da7b9a8fcb08812f13e7f36a383077ca +:000ed00eec0a4eb878885794953018c7f34e45 +:000ee0ff3e8e8f9a284884cdd29e64dd5cc4b8 +:000ef015917ba2c7816ba67b6604c39f0aa65d +:000f00374e93903a477490e4bfe4e859155127 +:000f10cadbe93d048c291f461aa0cfedd3f668 +:000f20fad3caabc5b7cfd4d042dcacd209b2ce +:000f30c362573f0bd312c6d25dc1a141f3d6f7 +:000f40f2ebcb7f4d3ce879ffa89980f7528c28 +:000f508eb06f354cac46d66c51eb612d0330a8 +:000f605ce25f57ab5a84efd79fd82a144daa22 +:000f70406f69caf2f9989b6ab340439888edb8 +:000f80e5980463b1eb40ee5484a5bdba63ece1 +:000f909627c398c9734c7ce3fc9eb47b949a01 +:000fa00f07fdd6c5f15ad5957b7c286d570ac9 +:000fb08ac799e44ce659d36a8114937c68fe98 +:000fc0ba5a24c4c40220030a67fb7bd1e21b35 +:000fd01998d777c67d896adb716913172f482c +:000fe00884c278e95bd8455935e84122e72085 +:000ff0651555795e202525dfde89e147323978 +:00100027669e09cc80a5120e9f01e44a7979f2 +:0010108c1756f05e0b46a705941f7c50a415bf +:0010205a5ddfe260245264d457b1c7d662afe4 +:00103079a3fcb72751012bbb51b4ab64288ad9 +:001040f533be089d65cb3f8c31a9dbed9f8eb7 +:001050ac36448a1c158ce9826060ad45eba484 +:001060b291c75903581b14f9381200e1de5bae +:0010701de172277ebb4937d18aacdb1edb61ce +:001080a57ae99915975c501fb496532bd21c98 +:0010901ea4ae78a2f593f23bd79ad2005ce18c +:0010a07dad728c96f6a14234bd1d8adf3eb616 +:0010b046cd1bdc66ce3a2e2501577006b15624 +:0010c067acf8ecfe30bc94c73c9b36a14c5125 +:0010d04da4e880f1a3798e02b99745922dba7f +:0010e06cd43dac184a583b0dcdad491d9d23e7 +:0010f0dc04cafcc995f4c5869f447ca114f7de +:001100113ae536eab62793d1d8a1bcbeaa2c74 +:001110c5a6c5de85c6832dd3d6996329e56aa0 +:001120218474accf2f1a501e8930150a354ed7 +:001130e8b22ba3eaccb3e8fdf6fd61b5f0b6f7 +:0011408e5089c58c1c4c8e06af39b475841ec8 +:0011507b5d5eb27a6290ddefaa52b2cd0259f6 +:001160293d65da506e51de5230b8698f5142dc +:001170d4cd9cbc413f4f72e853352c50f647db +:001180881524e19e1f00703c4ad7569454e27a +:0011907c4b0b91e6dbb6fb84deabcb2663f751 +:0011a0d805fcd8278a8ca83fc556955ba5c6ca +:0011b02397e79493f4f51f027c7e1db5913e00 +:0011c09a02591c8fdd0faacfb4b7012b227dbb +:0011d0b2f3be25942d7d46855fd697646b6d72 +:0011e088bb267b2ddd101bf87ca1cdea4c2fff +:0011f0e41c8c5545c329a769ac521f9bd2e785 +:0012008a8a41a4a721d75e4981b736b018d9cf +:001210b02e0917fe959f4a907a0e491b8f1ce1 +:00122001a287f803c5eaa0eb70b2ce66e9d634 +:0012300ca02ca1c5ebaff96eb65fcda707a06b +:001240e40160873d0f2ed98b4c9b9a9e748d5b +:0012502223d8cb2fb6ebbba0ca0d60d145b9d0 +:001260bb59568e3d793ad997179363f31be5a5 +:001270f30647029b4c6c8c1359dd3ae495fb94 +:0012803ac50c352935464a8d60804c14aae9e1 +:00129010a16c8e9de1001959ee9bf52239a443 +:0012a08946910c4d9f6b031fb5c68764cce979 +:0012b081b498e0c5fe5680ab193923624f52a6 +:0012c0470da293d5cfc8b821b7303b221144d7 +:0012d0b1d08aa65bd039131de9e6736e66a793 +:0012e08df346ddf3d90d2a4ab37d091ad3da8b +:0012f0d8409a2043796e218ba5a1057fe069c0 +:001300645ce414b7126398ae78e3c97f811cdf +:001310e754c57681596a50adf5161b0dd8f978 +:001320f23233563b395e6912e8eb4c2b8d3eb4 +:001330d7410c9bc21a0feab8a86d245913614f +:001340897c6d110551621c04c4d7bb245d381e +:00135080faa3a7f7ec39b1cca65536d2e39173 +:001360149e02d0d366050b0aa0f944842edab7 +:001370c132d28d475c6dea8f59b648154c8156 +:001380477b2c4423a9a3c2c0ced87c1ef1be66 +:001390b562d1f0f5656057a6bc3bb7cd9d2b3c +:0013a01812ed4aaa96b9bd3bec528113a7ed1c +:0013b0335610cac7162f9abc1c923ffbd068be +:0013c07aed8dd944b07ed6420ecc5c6d7b5c14 +:0013d0e986f0849487040ab21f919fc30db987 +:0013e0837cf9819a016aa893758b7dd3f6b7f0 +:0013f072a55647503a5b10931fce38862936bc +:001400bf583423a93ff511cdfdf1f008f82ae0 +:001410bbbf038c7c87bc31dead90eb9a3f2a88 +:001420d6151eb8148492f18f41944619061c4d +:00143067c263250279183ae567a5bf14e7c553 +:0014405a6582a07b1a7ad4d9e31933555e6bf1 +:001450f47c476385c2cf26084b4596d03255bb +:00146071c806d33529fcd6cbb7c99d37e291d6 +:0014708c1011e6e073cef1d0f8d6577f53eabf +:00148085be23234eb06e3c7aaf09c2c73ca624 +:0014909842bf42d77a11209f1986db329a4dc9 +:0014a034b78420642850b542e5188094508cbf +:0014b09608505fb42d1d2b32e03fb4d2e3d696 +:0014c07c439966c49efb035df0bb3d92e61d27 +:0014d0541d9621d3605a95f68c7a331d0340e6 +:0014e0f261eafc62976ca95f03457f9eb86561 +:0014f028f35bed05acc1f9cd92ce5e5d488ad9 +:00150070cf98a3ef77d9d692ff38962187691b +:00151050ae37bcc9a54920b34245f5ec71c6bc +:0015202fddd75b4fe4a03359d0a52491af566a +:001530f06f37ad66a3336bb84968b5dc8b710b +:001540958548dfd6361f6509c27951e8ca0015 +:00155078fd245f2ab3266d53b8556f4f117505 +:001560e9b74adfb2db4e9e0732d1129ee11338 +:0015701d738b7d5592e648af119cd6d2e9d399 +:001580d1bd511f218cfdf53266f6dc9ec5c9fe +:001590001cd1b4d10e9d51e04607e3a449b117 +:0015a07d37a92e451f8c3c23608e5e80ceff5b +:0015b00ebdee7a38c499d4b98440b7f8e65bd8 +:0015c0e904e474195a8e63db65f8ecd0a15f0e +:0015d097f3200d789a50aa6c6a88d4d75ced55 +:0015e0beb79bb88663e59d1b3c1995d67246c9 +:0015f030da4a139cd20ccc1c4f0afc2f5ae87f +:00160054caa52ccf9f8487c246872cf8c7517a +:001610d4a84a900b82509dd2d21cfb096fe6d6 +:001620c2e2e1133b061dedc1cb466f47db51dd +:001630a338b0921453c35312928fad54f29613 +:00164040f1836e7f80de0a3437291a89a4f612 +:001650ba5f369faef482fc7294b351c11f3be3 +:001660c360c4ef3aa159e1152f043adaf7d10c +:001670c22c1b4c21ff4d09c914d9e98a62fe4b +:001680364b36520c935fb6c6a9d18a7c1797ae +:0016908c50155bdaf7d05ee45fed015c9236e0 +:0016a014ce7fb8a431c799aec2752dbbbf49eb +:0016b0cf08b855d7774f7af0b1893abb5a2f43 +:0016c024dda4caeb22e4810c3158aeac95bbef +:0016d0dffe400d4fb5ccd0e1d7fd5593a26b5d +:0016e0f79c002c08a9b9f80d10c24d2f5d5ae3 +:0016f0402cd98b84667f8c17f40f764a9cc2ce +:001700aa5048990932c5bfd1739b84b89b7aa8 +:00171065dfcb2828b4223df407c3ed4232edb4 +:001720a7fc8e098d155363e5fd5514a5150408 +:00173038796f5d6817a42115c51334d9e2fe95 +:001740ae2f35b97fa973d68341e3d1dfecccda +:0017507246803a037907e58f9652ce7c05ce14 +:0017607a9d16ccc864a74758d3ccde77a672dc +:001770d52da2d2ddc9cc9cbdbb5b3f949817b5 +:00178016f1d5e80d06e5b3971fde02d4055991 +:0017906c3f2cbcba39685fa20efd242f2a1cec +:0017a025c6c15ef4f1ad6b92afe52bd974a52f +:0017b0bdd6dca809fef84c2e3cdb78563a84b1 +:0017c008e89874b14448713fcdbb8b69fe172a +:0017d0f2371dc9000c492df1c81fc49366866a +:0017e07da9562bf7f4ac4c41926105796c2514 +:0017f0c23738a691055ca98e7219a38bcae561 +:001800bdd6751a0d9577c1f76d3e9ee7b529d6 +:0018107a960eb621fdb538de28be74c09c86c1 +:0018203e067e6a156a35ced43d4f4c98872e21 +:0018308d5c56931774092c99087dc8ba2e8e66 +:00184049fe7ae1e510610bde169db3d461526c +:00185093df8c001122bfa2a9a6d0bfb56d003d +:0018609093919d79edbf674957c9b3a578c8c4 +:00187096a4f388bf518e762b627ff046a4ce20 +:001880be508dadbee124be557986eb4ca9768b +:001890cfd61fb8ded5d0d7f788817f332b7145 +:0018a0d2737dba21c662816fcae8eab9d93d3d +:0018b098536e4cf57a40fdfa578aeab00f5c2c +:0018c042a614644552781aa05299a059ea5bd1 +:0018d09110a0ff935b23ab20bd6e4afc43b34c +:0018e0a70740f33cb244468b9a043abd82bae5 +:0018f06ffe7d453e65d1a9ef99c6700fc14aea +:001900f5dab328f5534bae7a7728ea002e5767 +:00191019cc7c1185f67e3e866e2d8b93be6681 +:00192082e6be47c14c4787231cb9bc99010b88 +:0019301c70e2504fab4cbabb291a5acd1035f6 +:001940681f08987c376601e07ec75a156fbb51 +:0019500b7ab7b2f2b6ebe4f2d1465224ab5aec +:001960f25d23fd6e388ecb642b55af50f8c36c +:0019708019b76c6b7e04fb6d5c91029d7c6387 +:001980f162ca0be8f9861c833a2588df52644c +:001990e3ba3fc04d8ca41f7e4aec828fe78540 +:0019a0769691fb9566c09a88936be76e29f037 +:0019b00a6d610ed4ca831dfcdb86b8ac9eb6a1 +:0019c005389d87f6366f40e6f9deb72d23bed3 +:0019d0da9418adfb7f4b0e836b9e9997991c13 +:0019e0e3a3ea20133af8daf7d8c11e9f7e1a30 +:0019f0bc773ef27e1345616dd2776908e7a471 +:001a00167586e0eb7fff58265fc0f3158c456e +:001a104f95a0a3fbc660c6816e72953a6c1781 +:001a20ca39c6221b86ceff826bf53b7076be7f +:001a306db54e60fe3f3501f9484ee07cd7efaf +:001a40df07b9f605f86df8752e7da8c52b9f03 +:001a5062f0b73b12eeb2caf6a38f95756f3dff +:001a60e2d4b4572e9670080beeb04e1e64715a +:001a706d2ecd8b7709cf6892d2cd66db45b2d3 +:001a8037c5798d98d54c0ad3a6d0f7ccb92ef7 +:001a9059fbad0ac9f6ea3dd57dac173d9229cc +:001aa026bda99e32830e09f3bb1802e3edf259 +:001ab04368c7b9e292fec1cec17a7a2e5bb231 +:001ac029b992a96dbe1bc69c1ef658dc101df7 +:001ad00a38adc3e245cbb94a6a3b9a827a897a +:001ae04f3210aff981dbc878f063f436c38024 +:001af02dc66b5ffe62c1864dd295c334187ebb +:001b00c02cfb148b2f4f30f92d77f178a1740c +:001b1042d16140ee4b4550a2aebf70b0d73b96 +:001b203ed414e865c3cd4f8fe5d080fd27d177 +:001b307f0bf8d8e505d6859453e4f6fa515a31 +:001b40e5fd11a431aadd13d27e5479b9e3a930 +:001b5015d297c2523756d1c8c461e88c8a131d +:001b60763b44ec0b07f8a2c230b1c7330ecfc9 +:001b7034107e247cfd597ab450448d9a62c325 +:001b803bd4bf0114f1e95bb4c9670aa58c0b64 +:001b90fd0f97ac7fb267d6459bcba7a35908ee +:001ba098cff16e8480307154ee15fd72bebbac +:001bb06f30cc6a19669cfe366a2d412ef8965e +:001bc0bc893e429a93ff22644c677ce2127fcd +:001bd0e7fd5175432522f24bf5a386811cb76b +:001be0b1598d99435b7a532f523107c3384938 +:001bf0f4f4c4bc1fcae5d882148b25313f721a +:001c000653ee8336838ff23e88bb90e0719277 +:001c10e861fe710c72b2f6d0caa9d359afd665 +:001c2060816e635aa3c93ffbf94bb09e183832 +:001c309b5c58bec5beaf9ef403e235b96ed607 +:001c40d2c44e02230a9d88690291d11f572769 +:001c5076d46ffcd04a9f0ad5753c17ea4021d8 +:001c60f944d2977818ce0b02b06789a5359b2e +:001c7097ac6cf071ae10d00ecc1c724794eaae +:001c802f0e5881dba6098d54d8f9b48c5dad5e +:001c90e02b3e57321e68001f7de84c0a81bd97 +:001ca0869c14e366a83dc405110289b97d794e +:001cb0ad1e56847f714e87928560e289930341 +:001cc0ec047e2b622112226db885c6ba487223 +:001cd0fd890dbd4e75de19499ab2f3b15c5045 +:001ce059727c00d2ecdf6924897d40227a39cc +:001cf0599a72bd06bff1e501bfd5aa1dc1595e +:001d00a504a1e5390aaa98a0f5efeb61176020 +:001d103981f9c12fb202139515571be0fc94c0 +:001d2011995296bbd39fcf4067fdfad5098c6a +:001d301f8f48519e63f96a777fdbbd2bba430d +:001d40fd8bb6250417f9f95a518c94c6c4f786 +:001d50d1fea5c43865aa35c7c760f552fc1428 +:001d6003289d01bb9c9d3c53d1a3081754c62e +:001d70d54d402048f262f896983df852611499 +:001d80d044abe3a6ddd451dbc95e0c16637d25 +:001d90b3727657cb28c9aacc3e1fbcbad28755 +:001da0c7f66ab5661bfa0fbd8576575582f43a +:001db0d6d19f51ef828c0c901278f65578c15f +:001dc00d4f1a3e05484a981bad8f48f1ba5964 +:001dd048fb6510e189b69b50192bafa3f5bf87 +:001de07b728b086562e6307db59de71cd29903 +:001df0e2cacee894670044bb289ac230c89a8c +:001e00bdbebc39b4ae58ede38d1edbc1f896c4 +:001e10a1277aa9a021a907d3b060620fa03861 +:001e20a8b8cf697e44b311c116ed7dd91fcc57 +:001e3031d6b96e19a2c1b805c12773235b37f7 +:001e408e7c5ede74a668ff7ac3e01a896191e7 +:001e5001aa342462efb038b7ed1ac9dc3068a5 +:001e6058b985cd00901dca81e599f72926068f +:001e70e54d7de7617826e2ef5310e7a52253e2 +:001e80425942141a1322ace40bd4e30a6a053f +:001e902d2e8a20e837d9f7e9e88bced42dd057 +:001ea0d46d3ccc733c23a90e64d091ebd7a151 +:001eb0e0a9af11dca92c1284dbc28b9b8d57e8 +:001ec0502b371380c86dcf8e5e0bfc50b55ac4 +:001ed05c89a79da0b49d89994e84a9be1d20f0 +:001ee082f8230e765f1785fc20ebf4bd5013da +:001ef012f0e9f4c74f0f49590ece012b835db7 +:001f00c0fe9abde21bbd2592d0648f23962925 +:001f10f67838520694090dd6734314271fc04a +:001f2090dbb0b4575520be4c2dd934b571473c +:001f30dac7ab126668f69e71d06465561aaa1b +:001f40a9dfba31bed22f1c9f2e6715b9972fbc +:001f505d68cef9ed4ecf693b491297cf8bdbea +:001f6034ea9d8e713b53730547881b1119d4cc +:001f70de8c3299f3bd429f537f97a42d46e27b +:001f8087852f184e2c080b429c2c3de88d0bc6 +:001f9075adda499ea52ccd9b783c600da7b914 +:001fa0b34a55f5379235f7c28d3fa0f90ff5d7 +:001fb031d950795ae1ee8c50ac9aec50414c3a +:001fc07b61dc8d408d0025584c41738846cc79 +:001fd084b3e502e475ed82132f3175781fedf5 +:001fe036ddf9a442b9b2832cd54d347e71c293 +:001ff0d61ba2e5647b5253f80a0cd9eba72c6d +:0020004163de674c9bf46b867b8602a25b082f +:00201055494dae60b31d0e47c9975d29ffd8ac +:0020206c6a6b88120db582a8153001992b6d3a +:002030c8f7110a86c428cc83134fee525f3ab8 +:0020402b022142576f18c8021f5d3b351e67e6 +:002050af2cf7bd17f13d4cd5a90dfe74096ce5 +:00206039cd2a84d72970287b94599cf7dde27a +:002070e08c7fb399b29266ecdb3f8a62876538 +:002080dda5a00aa2e7cd3b23767a79d5e6872d +:0020903f859a7f3b17d51ba87b4d0a26669723 +:0020a0a7cab39af181ffe4b904f19e6f768e08 +:0020b0e3acfa6ed771b7a697aba8bd3b5315ba +:0020c04f5e120275a41f00fd695654a8494f5f +:0020d0d45ee7fa00071d7f83810f2ad1e2b372 +:0020e07857dfdee42d98adf80c9a423a4f1d5f +:0020f0b1ad2a686b80931b8617689a89948e0f +:002100affb37e62c25dbf075603fcb8b3f3d23 +:0021102cca87fdce84f8881596ccda3cf77a32 +:0021204c3a5379015d01b59f0b30816963106d +:0021307529982d866f3275d51067bbd802d547 +:0021401900869cd48ec68ed2f958c0d562d37b +:002150689b8c93f1ad2a7d0c64d7a916fe8600 +:002160688007ad8f99df18925ff9c37e312ac9 +:002170b52235dde88c2e2df18162aa00c8156d +:00218063a9af28cf424e03456fb92d623a66b8 +:002190221e2c371c38e10b8dddbb86f7d9d50b +:0021a0a153a4a2b669f52d6a75c90e0a163928 +:0021b0bb144446af40970af7095752ad7a536e +:0021c09081a2824a052419f3df04f44900b183 +:0021d054e66505eb1a1563bbbfd4257c2651a9 +:0021e0e56fab4fae66347e12c2022eaeb64efe +:0021f0e0fd0a2712d7cb6cf271cdb261d62f82 +:00220045cda5eb65c8868884ebecdafba9c909 +:0022105bb355bfc9235128df64212995680f90 +:002220b59c9067321f5c36a0ae3cf5ca60cb17 +:002230b33b7564cede0a240874c119e78a6549 +:002240962351bf16e191d1d063770ce9d46905 +:002250afcda08c0e5d93470eae02ade945268b +:002260a6c2782b7afd07e3db84200ab3cd53be +:00227060e7d2810ca7de0db3c2cd397b2f2adf +:0022805249692b5401e291babdf3393b646350 +:002290c2e0cdee0a4f5e9f75c032d3dc35c12d +:0022a038cef138053646473b39eeb80bfb4ad9 +:0022b06030c87e4a1d2df6edc9590f16d953c5 +:0022c0841b6dc3c5f28fd70372dca9b7e4bd4d +:0022d0197e0bda7c8b6510b0c4b31ffa778089 +:0022e08a903095e333fe0ef7e454fec2cebd13 +:0022f0671235bf70a9429b2b4b67f66150ed4a +:0023008e4e16c2420282bc064a767dc46480ef +:002310367399e3cc2f7f7296fa789054a89817 +:00232071438a4f8d4c821f7bc1e80882649370 +:002330f48a0afe41b25cdb6dbfb837ec8fbbae +:002340ba84af67c01e25da84d4e89d548e9d4a +:00235094d45449d6d42b8c8b466fe23061863c +:0023607078eae199c1628a4e85e4c1384d7118 +:0023703adf7abf15c099adddf00e2c3b5d15bb +:002380698410dd399eb2d0eac700ee2729d561 +:0023902f9b6816ad9c180fde3deff57e2d568d +:0023a0f60dbdd90b9101e27341ed87b2dd12fc +:0023b09e3dc1c15bed0cd541141f8703cb1a4d +:0023c0e9f30fb6845200a16f0b240c899bcb1a +:0023d0b441c8dce0fa972283e3f4ff1ab8e9fa +:0023e0cfebb222bf08c3aa2b4ff73ab240d440 +:0023f0f571774ac35a3a109baddb5057e4d984 +:0024003c265a395f54ff39b3eb6f8f24b5a9ce +:0024101499ab20f85bdae4f3703f4ffbf2755e +:002420927eaaf14215b391fed35125ebde368f +:002430d85819e4b53b5af5188164124eae0ad6 +:00244091ec214493c9e26d51dc5800d4708eda +:002450960c8f0ceb10cf31382b483b0e32d892 +:0024605143904c4b0813e7051976b6b163d787 +:0024700e26407f593918edc2e1e4b4431df447 +:0024804a6700efb9662ca2f6d56d10ec186304 +:00249076325675ce42c09626d6b905f7600974 +:0024a022ba2ab266cf270da5300e0b127b1cf2 +:0024b0f5ab0d1abe4e16ac430d66dba577f67e +:0024c0eeab429eb087368f78c4a01d2788496b +:0024d0fe829be7c31a558227123667f7ebcacc +:0024e0e6283b87303f279d7c48ca280659e13b +:0024f025676c97f31c736c72dd66ab2ceac2a9 +:0025007e1c0dbb6bcaed5a8a70e289684a2d4b +:0025109813c9155fda3e5c7204c95c0ffe9fdd +:00252029d212020ca787c09fad2039311d7fc5 +:002530ee1b49b84c90988d175bdc4c44f8dc8b +:0025401804e3780c0f781ce9cc2d2cd252d61e +:002550f30e784e1d6db93437d3dec29e28ac62 +:002560771b60583a3e300ea7fc9d836b0012a8 +:0025703748c1f0fa718157b20996739710b138 +:00258023ad59bbcbdb2f47223ed70a7431afd7 +:0025901d5e3859b0b9449203a58f9d4756b985 +:0025a046e4e4348a3824b199ce5c9fa8b7782e +:0025b0d4ce1e4c1a5d53d5c7bb0c0a7f310488 +:0025c0175e3cb696bb9010b384395e2b9588fb +:0025d060a00a722ab7b7b7494ee69dbf1e8d04 +:0025e0a2a7812124a82d02bcef707c7446fa87 +:0025f0e11157cb35aa924bcd5b69831775c4f0 +:0026009d6b9565b7b684ff7cd2c7cd4763e197 +:00261050e2f02ed546d934877ddf293e050935 +:002620a10c30b2ae04750714a91b4647430e26 +:0026303b880edaf0c3ffa77af22b38e150f7f5 +:00264064ad01a9764f9befacc082a86640bcc9 +:002650dbea446088090d3ede59bdc3039a10ee +:0026607a48778abd8241b630d46e0eaaec4996 +:00267016af0773f26d736c32fdef91c88c7446 +:002680ee038855f684596685e353bcc31dc237 +:0026903d86f51d815f4978819cd024501c857b +:0026a06c71e3b439f7f2a4f5fb442fe68e82fa +:0026b0268f6ad0e7aef0d74198ced3ee3b441c +:0026c0bb1318730503941b194122798a3618fa +:0026d0ec2710b74cc1da55bd5889ce62109550 +:0026e0ed9370ae6c758fa97cb8bdbf175dc2b7 +:0026f0f962c30162457828eba4109dcd46fec0 +:00270042525f5ecb91614b6fdec39834fa8b04 +:00271062521596c69335735acc92a56a65eb6d +:00272023679f36cb37ccaa06d862d947d87879 +:002730dd1c32d9a7bbba126c7f2cb6e4455790 +:002740110aabe1cd612902458dafa48a3d8a2a +:002750ae38a862632cb77bc8dfac3d2250e8b9 +:0027603de873fa4c120be6f246f73518d4da8e +:0027704e176385f8dac833ad2885618059ea57 +:0027801a755bea98b252a22be637e6f9924041 +:002790ab01ecc3e5deacf8f0b7902e121305ce +:0027a0ada38711f8739817c0e416e2e5b1540b +:0027b095a11496c91c5caea2a90b119aa515e1 +:0027c0f035305698245a82548eeb7882071971 +:0027d00e500764b98e6057661d8c25f47d79c1 +:0027e01764e294149fec9a86a99b4da0a6fbb6 +:0027f08b7ad3a0aaa1e875318a773eedf20f31 +:002800ed6a1c8043a72f8ce24ce44fb41a9e35 +:002810cf9fc08c99baa0974a0a63b462a114d3 +:002820bce2ce9be100e2e0e37a42f2d73c47a9 +:002830bb55d963d740e03d6bb0e3c423e487c3 +:0028407b644e9bb538ab901383b12daafa6e07 +:0028500f8a931e2ea3082eeac9c0b490fe0f91 +:002860dbaf1f407a8d1d8241e094fe0b7a2614 +:002870c12b4db9c778c04f7f48e54c110f6b5c +:00288004cc5fd5b0a17bfd89d810da16b9b2cb +:0028909d82abc7248d5dd4a2cc6a5fecafb98c +:0028a0cfd4cf3611d9594c895bad07559a7517 +:0028b0ec183db6fd6b9e61e65a8b554734bc57 +:0028c0f74c9b476a4b919ff4c7f49f3d203a6d +:0028d09bcec2334914665685c45f2315085fc1 +:0028e045797997e355d867a55ac655555ad5fd +:0028f0cf922452029cadc806d16326157a2bf6 +:002900fc703883371bf5de485641fd34435fa9 +:0029103d50239bcac5e077b1daebdb14a1949d +:002920d4e4702566f640236c4d3f4d0c3c8c48 +:0029309ac1114a5aab3590261e6d3e80bdda80 +:002940dc7bf3cd0a920dc5c80156e6ccea9afe +:002950e94da265477be84861d2d7403b9f669b +:002960aec81053e19c8016ac8bb18bd7ff640e +:002970abbd6fe0b939d7214fedccf966e1ac1d +:0029801ba1d07492974b2aad627fb999fe7372 +:002990d96966774600ea139c95deed145efce7 +:0029a056245c20835074113116a9d9470f63b3 +:0029b0f4a0c2df30c0520eb517bdc77b32df37 +:0029c06e6316cc3996d993105f89a4614a351d +:0029d052fbd997ac7da9570453a6de61c83da7 +:0029e0e75342192837f345de9906993a08dc82 +:0029f0b446de1b9cc0a08b484ba81ba0f27d6f +:002a00b46fff88185b59a4e6683e2bea6ee530 +:002a101b35c6a278d48c9d94c5825b4823ed7a +:002a20640d87648d885b339d6eb7b1ec899bce +:002a30db8bef6eff88a4e8b7ec00d28f67b277 +:002a40c952ef222a12212cce0aa29631451af4 +:002a5085031d04d5b5a92a316994dbd501e278 +:002a60405411b2e24151143f8078c70a244949 +:002a70fc59303c6accc9ba79e0488dfff8711d +:002a80c180052b778ed73edfcb6c736f1358d5 +:002a902889c218c0f2ef3a09695d937c50062b +:002aa0b20181be87ab66f821a7c66037237d72 +:002ab0ad7b0ddcdfed06992f6346f7dce5420e +:002ac06c401b61fce6f5460e275547331d5543 +:002ad0b3ca9eb2a86068e893f03b9c43bdd23e +:002ae07f2bf12a9242376dff5a0695e71b360e +:002af0986b5f2c9debe01377c20d73beeba4a8 +:002b00be39a5c03175502e5055ff262f35f4b8 +:002b10966541ee181d02cc95b9ac7ebee4f8f3 +:002b201d13db8cda12a73c568b148118c5cfbc +:002b308b575559eb1f8b40f8faf5b2dcb11035 +:002b40eeede0bc75902e184cd40a253ec34fb8 +:002b5024f7c45c51d7385771ab6f5ec7defa97 +:002b6033f67d94d52b4ded17de0cfe2cc8e1d4 +:002b70181142272ec5a251dd55ea53581f3db2 +:002b8043eae0a4b930b21ccc937134c88a16d1 +:002b90c38e97bfd846b24400cd6e2698a9c871 +:002ba09432ba00e91671cdf50a2b84f12a86db +:002bb0389c28f82d8920526c7f297ba76f25ef +:002bc0b768ad5b245ec55d30fea57409c99a4f +:002bd07c596847c30e9b63431b8d033cb43889 +:002be0edd48021efc5db61d342eccf9095c9ee +:002bf01dac8dc3665a5f9f729af5b895107dec +:002c003ff28cbdcc4aa6a52f1228993d9e805e +:002c10bae558424241675f0385bd7800c85ee0 +:002c201e5da05e8f4bd7c4997bbc8a16f156a2 +:002c3012c8f9c4757d26fd0153d0ab052d51f0 +:002c40d6f31a339b6471ac7d4cfa75530706df +:002c50a3a505b72ef62bba3cd1f1fc19b07bbf +:002c60c07e43ec3a88b49c00e1885577eb9572 +:002c70481801c3c7587ad94da00c7b5ebfd033 +:002c805269161da90a37c1d320ec45d201b12d +:002c90fb02f2fcc3f66064672d969800f4eae8 +:002ca00199a3bb8da09043281c416664b57261 +:002cb0c118abe32a2115f4eca71f50a1f5d613 +:002cc0809b1fbe74b831feb4ab8ec1b0af9ca8 +:002cd05976617a58bef85f895399784e1e6129 +:002ce07b160ec3d6459fbbc508d61cddd55db9 +:002cf0c2976a8b86cb8acd418942c5b095a57d +:002d0012cdb63b6a3e51529f2b87fe8ea4c9d2 +:002d104d3cbc54b76e1fd0ccacb04e2643068b +:002d20bbc00048cc7f3c2996b688a2f58c7989 +:002d305e53e40cad33d16913b3aeea7d3d0a7d +:002d40a37eb8802dbbb608335b51b6683767f4 +:002d50de72437476ba63ab1686916720aa7f6b +:002d604ef76496de5d4c4cd450ed5178a3bdf3 +:002d703e6c218efbe547ec813d301397f9ef4d +:002d802095bc9062090d7f56fbb73986746f6e +:002d90ded57f9e3c82a00dd8a5d4b4a37b2f24 +:002da00d21e459b2ce733134f72648901d0263 +:002db064caf308ea25ce8901ed2d8eea624a6a +:002dc053d751e9288a70b497f9a680d8c0d0c1 +:002dd03daea6546e0e9b5a486f9a255a5435fc +:002de04e546392dad30ffb7f40ad820f4782a6 +:002df0504c643a92646437a0c39c856fe01aa5 +:002e005cf562e409ed62818c4b875397c73472 +:002e107869e53b5f6ce0fe0f9ac3e3a9d9c143 +:002e209e7045dd00141f6a5d7b02640843aa42 +:002e300ffb8fe63adf494d0ca2c080b35687f3 +:002e405edafdad8dcd61af10ebd98c1967f7d4 +:002e507e2a56bcbfe9d128dc927c0e2c256128 +:002e60df68ae3645c434877c6c1826f3036022 +:002e709b33216f1d1a0916a90e4cd42e539e6e +:002e80a4aabf0e875e3f4d1bd2d5bff62a2327 +:002e9071de7b86f6b3d43003f7512f5ac2222d +:002ea0dcfeb86de5e56edb146f5c0ba4fc242c +:002eb08519e8bdc0587bb84ab28037463248c0 +:002ec09292106a9182f04a7a742208e0e09e85 +:002ed0ddb76612983f23180f65b8536fd7a297 +:002ee017286ac61389c8d5a59d147a194e1f9f +:002ef0b334cfd157b479be648945868db6e4c1 +:002f00055571607521d570aaaa166273add3ab +:002f10485a497ae3aff489f9fa125cae67e233 +:002f2033a53408302e3a437cb6a766efcf6860 +:002f305ede0ebcdf0d115a3d0088a797b0f01f +:002f404a9e93e8c4b146bc6ec9ce5dbda443c1 +:002f5033a4016e33572e3dcf497028bde328bc +:002f60e7796d57ea244d25510b7864e0e8e071 +:002f70572259fefb195829b24d14f1fb24da10 +:002f807c6183a57c1f1cd512b84874e13d263a +:002f9005d25e85ca2cf7881d5c6f79d1e75189 +:002fa088587924445a62f56a2094f2d8b6f357 +:002fb07b66485baf8cff4f3992a9d1d49666b6 +:002fc02b4b1e763f9ceeea0651121c3507007c +:002fd0ded74067522e8cc88e5ab39b38fc4149 +:002fe0fe6e26971ecdf8f12549ad223d63f7ed +:002ff08c9d95e8e9f81f1ffeac2e812c4debdf +:0030007e9bcb8cbb7b63f9b2b67d3effda0bd7 +:003010f1fc2a6d8dae99ab68531e8e5613fa38 +:003020b1a7580e6a3e809266c68810a37de67c +:003030cf153134f9a11d53d3de688a624c35ba +:003040b2ff4362195f013783b07c8a03f2b4f3 +:003050f5cefee25578b93d581c718d674a601f +:003060a2fb6dfcd198bae887ba81a062b3ac78 +:003070f8bb76b1273083c7a19cbbde583c1ca7 +:003080a9eb30f88bbe5576c1dd816a2a62e587 +:00309059f0886aa6458e8032d0be3fa81e3919 +:0030a01404b219ccd5113ed1d359c88d04bad8 +:0030b06a77ee0adb82cb2a7e0722351e87b045 +:0030c098589eb89dcbdb376750ea4994df6600 +:0030d05dbd545c83eaef3d7ec06c81615b99a2 +:0030e042ffcc54592b44647eef10a2bf200a12 +:0030f03aa93027b69c5d0c2300c690af333099 +:0031003b376e03062d819ddd48765d46bb3ed3 +:003110816b78c35ce19535870fc8ca944ca8a9 +:00312020b629b0a9f56bd29daff18bb6ceba52 +:00313043840a8d15bbc45d521a9d42b267590f +:003140c191197d6673db5e3ae90b2f685680a8 +:0031501f05d481dc337f0bd76eca04ef2203c1 +:0031600745cbcdeca7546bab950cce0231218d +:0031709128bae74a1469a11f7f5795dd3d4bd9 +:0031805897942d2819f53bf5bd5c32437b38df +:003190b7d197a6d3f1c11f1f63f6f2cc76168a +:0031a0b74ca0a1a33eb2b9d6dd3dfbfd7de9ed +:0031b09a10aa698f106b5305ea7c95c3bba22e +:0031c0c70f2a6f29f20e5ec8111651aa863fa5 +:0031d0d45bc36654a625e9268345fe57d3a90d +:0031e0ecea07463273496e9bab70d780c3be32 +:0031f0b12b21f045614637d67446bb665bc389 +:003200c86082a03b4526d7657d13a21dfd6ae4 +:0032106e2b41edaef2a096d10f7029a9ec61a2 +:00322017cfc78d22083eec398ef3e6020b6078 +:003230b09d958f1fa2a796dc40edd61bffdd4e +:0032400dc91fc0ee099f65ec4351577e756897 +:00325022339b92da49a34d2deacc3cf906f854 +:0032601f2cf56095e995e828e4bfe3d74b2381 +:003270234928d83aeb09fa4f8a71e4be7d0630 +:00328044cac5e1b20f5719cedb750170c33f79 +:00329058e3d0a21520bb24e23ceb33090011b8 +:0032a0a2951710acbb582f440424a9dae81a7c +:0032b0064ab7ccfbe36f8c4799cf40dfaf040d +:0032c02c6c28e8e2d53dc5f012eed6d7969e9f +:0032d0f6d1c0dbd09d9076043d55f86b22dee7 +:0032e07224b0db43eb261ad11afc2b3673865e +:0032f0fe232ff0bc47e8917e20a5ec71272ac4 +:003300df5c5b28aa45dec27e909dc861af4404 +:00331036ed4541a6e63048f6baeabc65e2c876 +:00332085fbcb702ef7850005768cb97028d338 +:003330b2e2d1636c960201b6d42d6d7e836e84 +:00334003e65acaf0d19ce49294e5c579f9024f +:003350c5042d7d1bf86d81c0fdb2a7f92b17f7 +:003360268e1c0578b00b966af2cfc609480928 +:003370dfbf2d179c0cf19788051de70f4cf5fb +:003380038bc8f09387834bf77f661c0ac5b2cf +:003390778e3d5ad0f3353bb5fbdaae5ee2a9c1 +:0033a047564de0ebc888c17713252696eb3a88 +:0033b0b776e5bd36ae304a7d2e772bd7d113f6 +:0033c0ad9b2c8751f64a3d02ce55874962e274 +:0033d097836d85a5fff7ab65594268fe39c658 +:0033e0c9fb5efc58b862ad01b0b5690457ab9d +:0033f0d33b1005e7f4911301fe9f07e11d981a +:003400d81ec253331cd6c3d213048df44602ca +:003410890c9ab61c967e15584170a313ce5bbf +:0034202d9cdd2e33a4905d40b0f2790845fef5 +:0034302c8e1b6533833a96ceb90744058a5643 +:003440046b5d108ac3d61dde7623889117c681 +:0034505d5c61c00de2e5dc63d45f890be84ec9 +:003460ae80afa615f6026c0f067857995ed004 +:003470e9f6144302f9a964746a3b28f7832f3a +:0034806888f44b7809d3b48ef95ea90abbdd0c +:0034909c14f3efd71933c5688f1273c93599c7 +:0034a084d260b2ec2ebd3693a6e42ac0640f42 +:0034b0dce82bbaa863ebae352655ac02b7b210 +:0034c0b80ea4e0a8e291b1ff3178bc3569834d +:0034d0e7a5c6dd009350b1d82454af078a1a12 +:0034e01e5df0b94eec91890a27928c443f220b +:0034f0642410cfc76f3d11db638c3da65616e4 +:00350081f0e009b2b058d089634818fa8253cb +:0035101b719d30137075a1b4a02e53814683aa +:0035204464d407ec808950a3606ec878946c5d +:0035300c5c68f0796dc410371b21e154cce79a +:0035404cf76d8b7606f0d9e4f34c3849b2d657 +:00355038ad42efc4f7db4a1744f7f6624ce164 +:003560c2e3a324e7fbd7a88fb266be09364b00 +:003570e399fc4c6583442e8c107b601f7cf446 +:0035804a4903c57acd36c7f035cab91e9f9968 +:003590837091e6df123e4b9395159e442dcd01 +:0035a03175884bd50f9c99f7f1534b60f4b30c +:0035b0ab9ee797ae226a1897550a8a02e66a13 +:0035c03d4867b3ae3be9fe641dc0054b50a66d +:0035d010c0af7649fb7d9f6faa2a9fb9238716 +:0035e0e7c3e450bb771f2f6b518c7486178474 +:0035f0ab4e7af2eb49de72d429e61a6ed2c505 +:00360002c6be44371e524edb871355b1d173a7 +:003610005a236613cc855f755930d5e8db026a +:003620ac06241c50a4e4c8d0d3981abb2dcd32 +:00363091a1a9b08a1f860a88d805e3ca08e4fc +:003640a05888d8a8be46087d99665372a28bae +:00365064c3e25656832b406a2cd7582e396af6 +:00366068923aa04c3d190410f74e3de97d1101 +:003670c9b646b8059113d8d2f8f1ac25e3ddec +:0036806fe0af18231341aee975314ad2934e1b +:003690dbc4779baced192a542f2ff4b26290ed +:0036a0838288f6b81ad6ea8a18d17bb95aacf0 +:0036b0083fff7df058edcd3f5c427478d02f85 +:0036c0e4e03cc84e76e7b15a415ba56a10abde +:0036d01841f9a695151f5d8384778dd6dda5a3 +:0036e0590a707ee856d7756bd5725f2a2a13e4 +:0036f0cc17278257c28eae4941fcc9932670e7 +:003700515379857f3e9f8f810a18e7b1fbfff2 +:00371028e01dd605ab26291547602fed66efcc +:00372026c934ef72c082bc8d9955e46e90b714 +:003730e788c7272f61c637f3311ddb9a79cc94 +:003740e63d189baff2db88e29c9b76488cdee3 +:003750253fb90207a0b61e0418991568a54fd8 +:003760941874ce763b4638569b56db948d8100 +:003770b3b8d49352c61786b955854186f554a3 +:0037808fc080561e01d33bb34cd305d8ac9ad0 +:003790abdce8a4338f62b3185fe8e7d1ed891d +:0037a03a6f2a9f3632dd146dab859d5c925370 +:0037b00d23ce7001e524031b5f2e6da79ddba2 +:0037c0ba915c04ebb137c6b754e327de9f7686 +:0037d0078ef3d1307c17042d66848d9f7ca598 +:0037e019de27d3823b43ae431a8f67e814747d +:0037f02a8f818c7eb92e44a1515d0f4c74013b +:003800d5f5057a230d4a9311c142b4db74a07b +:003810dc10370529ac4422dcde56fa697cbeef +:003820c5fd107a11aea8cd1953db2b086bc01c +:0038302f1f4c74eb26e73a1a7aebfbcdf9ccbc +:0038403ac9e8a15bd7e2c9418e7bdaa1d55b09 +:0038505f8694eacdf0949fb8c842af952620e2 +:003860ccdd5a3efb54a7dbc8ae9b0f757445f1 +:0038701f93a0dcfcb08d7046a92aafbd615a5d +:00388087a51d6c7395950172f07e44ddc97ea9 +:00389051acbf4031dace067de049e7758dd5ca +:0038a0eaa9921030bb3919162bd35b5ccc03e4 +:0038b0b9267297c07ec50642682fe8fe286cea +:0038c01fa4f8e740c601ce3f0660dafda350ca +:0038d09147af1e8bcd8e887ec8e46c5d475722 +:0038e00d46f85744c4dc300aa6a01ac8866802 +:0038f0f2c6c483b42215918d7d15f508be258b +:0039009ab39a3036665404e1da1ae7dd1d2047 +:0039109925e8b1b7141730acee55f2a42ca2a2 +:00392031ff1f1f5c9d6e5805894db5d40d2ddf +:003930bf97efc1ef1a238efdb993299fdf1fbd +:0039405016285037cdfb73b80ef75ca187f6c8 +:003950c6dba245790b829ae8baf232ce392d6d +:003960ecdae522ad59c79590e059282e8cb0ca +:0039705263eb27bc07e657d81356ffdb9c7055 +:003980137a3a130584abbad1a7db4d49734702 +:003990ed7a2183bcd88fe0936d43811a32a0e9 +:0039a0b13d4016302cec990d9ba3810937556c +:0039b0241c72c95019d12e14eef0b061a282d9 +:0039c06aa79b3198261bb7543b34eabd4b5048 +:0039d0375c2539d5b7d266ef9e988afb0716ef +:0039e00d1befb71d23c8d7aa10d533c72f6a09 +:0039f0c04db65205e8e57700b3f2b54b2539f6 +:003a0036e69336fd3fc94a647f981e17413273 +:003a1010828bc72d3c4fd1bfae9857302a6f0c +:003a20905bf6ef7a20a024592b53e3647f9ae1 +:003a30ce2c6c31a686e6a22e65e788675bb510 +:003a40bf02b5480e81f626bf493991ffa92b44 +:003a502c7bee9106b63e2fb9e4cd96fbf5913c +:003a6049bcd471127c8f9a99465e22b1c79845 +:003a706e360ca147a3911f1748aef160af05e3 +:003a80b3badab633d622bc22cd06cf8e138c3e +:003a901d765170e86ad7f5b8de90d0dc0ab6f5 +:003aa071d592d08dc248e9b2ea5a0194694c14 +:003ab09bba2a4de4677ed4fd825bb0704a2186 +:003ac08b0e89fd8ffd83a03a5d98f4582eda19 +:003ad0c9e347cf035d348b64064e2621ca9c46 +:003ae07743d09557e8516482407c04c64909be +:003af0c2b407a41fa51dd18a2708b2fad0c0a6 +:003b00144840304538534334aaa4890e81f624 +:003b108f47d44c9241f00ad49ba898f383f370 +:003b209b5af280ef4bf4c6801255ee6ad8a7aa +:003b30d8d686b9d3585d1a8547637c7cd8e3c9 +:003b4053d271fd645758e4642ec10b3b8ccc2b +:003b50f8349b664e3eaae88d80456090ee3a6f +:003b60b0022199876e69ad72b77cb9e1cbe35c +:003b7062d59072c56f71f5a1dd5d314a5e8c8d +:003b80dc4fdf4722b682dec561368aaaf1308a +:003b9096dc45e4571cb7049b9bcb91315e653f +:003ba0ac103a571fa2be5266aa5a5e27055263 +:003bb0c4c6700a14ce825a5ec9d0cbba395c19 +:003bc0b122531094ddd516b6d99c5819d247cb +:003bd0ba83c0a5b3bff3d195b72077aa5b4bdd +:003be04caab04ea8dc720e2e5d76c8a462f4ab +:003bf0d6baec126e4c07b582e90b285cab0688 +:003c00d7b4136e514b63939750199fbae07365 +:003c10768d59e0f0999f34e4cea24a32ddcb97 +:003c20f310d0849968d836b7570bdcea001e5b +:003c30e55e03b61f6f9c716cc83fc0f521d2bb +:003c4009335bcdd0d7b6d1aeb0bdff0aaf033c +:003c50f18c8ed3a0b7a0a01f5485c0f91fce69 +:003c6072c994753c451c5942d2db5cda24296d +:003c70e11b4eb6ee7180065fcf06f779b8c35e +:003c80c26fac066cbde35ca9a8833c35da7c14 +:003c90edb5d92251f90b4819c74922d8ff15d5 +:003ca018b069f829958b7e7a214fe2a1b70b1f +:003cb088e282ba283c2197a097b6421b48f320 +:003cc0ec14fe233e82b872b70364c878d4049b +:003cd0b37280d28c9b5086e85819fdd21a1949 +:003ce0a8628c6e2eb15e2e877fc462e7d83a3d +:003cf06fde98a8e4004e3f4319880593e25cc0 +:003d00b92567ffcf88a562c25c483e1b39fca0 +:003d10ce4ab837c6563ee25936bdaeba7862c7 +:003d20972a04459e4efc5bcdbec1188ce080a3 +:003d30f2dad7c28f6254a069ca287684d0dad3 +:003d40ddd0499711d16773dd0634ad56e5e52e +:003d5080ab5db2a720a96a3855b1cf7d9f29a9 +:003d607806428d5a932913b19906820542249e +:003d70e013365d13635f937547264b7aa64691 +:003d806d46d46ecdf26e662fbf950fe6e2d3a9 +:003d903d50ea8eab6335f68c8d9146fc27748f +:003da02df4d24231ee4670fca21cda2fc35322 +:003db02dd179aa1275fae7c05dc68ce04e064f +:003dc0771d63d8605a4231e71d639311d6e357 +:003dd019d8f3dcc7ee0ff2f924a51a7f4a750f +:003de09f7cbb94fb03aadc18f64b0a45f9733d +:003df0e84c69b0535e02385479edbf8aeb09e5 +:003e0099649aff5d24e13d1d8c6335b74a4163 +:003e10c4b96b2aa00a67415694ed97c810500d +:003e2004c779f46603c664c3161814f54e7e77 +:003e302a4596e03c120aa1d14a8c3eab83db76 +:003e40d8681daac9141d09f777f91c73bc30dd +:003e5008a366b0ae5c22ba5878ee45fb182d0f +:003e60c7d1f0f0b1d4905c1ce35dd191bccb94 +:003e702f9754380ac652a6b245cf2aa040b3b1 +:003e809eed2d77af3a7b1ef4ebd8c9d178f76c +:003e9019a2d4d1636c0d3db33f2b916b77168e +:003ea0fd7199a819d0402b8f5bf11e303f999d +:003eb02cd456565b2ce96fca949727359b908f +:003ec02691c50ca34e24a505f9dfaf444affbe +:003ed0713000c6d67d653e4a042ea5b8797199 +:003ee0c7e8373ba689895b4c225a65ab8a94af +:003ef0b252567a6e981f34bb908f6fcb08a3de +:003f00f6505005bbb9625fb14fcf2d1fa7b905 +:003f10faf4b53e789ee0c4cf3703f29c5285e0 +:003f20bbd7fe79d7c57e978861284db7f9a19f +:003f30f336b3c872fcf936eafd8f0235e78f1b +:003f40eec3dfc30e6f8c2f32bbb06dbe7962f5 +:003f506f256371559115d736851b03a87fd792 +:003f607d345055798e94c66b0a1023d3775051 +:003f70314d6ee1b0a3df61a6f3f1f704e0e276 +:003f80053c4eceb6d7591a24cd099d24e04ff8 +:003f901613ed789f7b5f96d17a41ebebf97fcf +:003fa00c5269c38c76a1808b23367c7788e13c +:003fb0de201a632ae6ee80d06f47816bbbbb8a +:003fc041b4ff8dd137b12f085020bc2060424a +:003fd07bff097665e27136e9e5ae7a00a2cbeb +:003fe0f69fb5ce0fef67678377724e6ed9bb34 +:003ff02716c8703d697c4ef1d65effd07dd50b +:0040008f59c11a15ec73184837c3a70c071517 +:004010d87a34428a8b7ddb99eee3c3fd1e9981 +:0040200fbf5ccbac29c7eb40936717b1dcb07b +:004030367f232d0a5608b5071e637943680e2e +:004040ef630696d48981a782175b2796b50d48 +:004050cdaf9935120be633ee99624dd1726bf6 +:004060b5c6269d9a2b7c332398d32479b5dbc9 +:004070dcc91f6e576eaf1cf1d16e655e6692ab +:0040803ca861f0c583e30aa55c18684ff105c0 +:0040900530db660a91415dd00e97dd0922086c +:0040a01d5e7e0fe82e40c7a9e77a6522b8c413 +:0040b02d7ad6f8789f7e67cb6bed09828ecda2 +:0040c07d37838a7636c643822cadae390ef803 +:0040d011538ae13298ae303e6a6504f869bdc4 +:0040e0b09609ff6af041ee91fe8066256b5a33 +:0040f0abff148b763b4221880d77e0e2402843 +:00410082002e23f82157a840028278cc857e34 +:004110adad27891c41b3c1e85fcc30c95e5395 +:0041207bfbee35d22ab20a27620759a1078b39 +:0041309123ee542c87abe19bffd1997bdc96cf +:00414043d63d8818b695e93708c9da83755c00 +:0041509020588b9e749c0afbf82a8923f62956 +:004160d15ccc001e578ff6cf66b20079e03e47 +:004170a8ec36d8479d5db119f6daaa7edd8413 +:004180b7ac91909855d8543790502343c3b931 +:00419006a7a7f92f8e13ef7149f5678a29c8b2 +:0041a007369f7f2f969c077ee74c9b6e94ec8e +:0041b0257f2900b19eeafb779f483b6cd0d2a9 +:0041c0227fe4376879dbf8a8e72b7fd76be652 +:0041d0f40ba758197398cab586a75346b3efc3 +:0041e08e36e223ad924d32b17e7487d0a35e98 +:0041f08b808bcd09277b4a3374d4dd1264ac3f +:004200c585a2fcae2f10633790a261d9f747ef +:0042106a2b18bf034fd60550454cb75c293534 +:004220eb4b7aa9f312cc1d56333697d8a70bfb +:0042300acbbb452dd84591bdb4ab49575b3d4b +:004240c4f5e63e76054912a757bd7abea0e119 +:0042501d76bb87402956f88737f5fd87df4e9b +:0042606aadf49867cd689d63cb2c4511835a23 +:00427001c3fcaf147c84336bae544c3745adb4 +:00428072fa9a55b176d61bab4d2f5ec1c3f73f +:004290866f4742207db1381c80a0d5228789bb +:0042a04e9b77a4811c36becf4d2e6f1169d9d1 +:0042b019f80f784e168e09ffbb9dd3b4ade64e +:0042c0cadf174e418d0ef7f952f5fb9e87a2cb +:0042d0a90541a463832690767e356465a67956 +:0042e08a638cc9139a0a9cf7f4e52112a35fd3 +:0042f02199271eb0f8a05a0f54d59c062ca2db +:004300e0432d0d4b531c935de79fc520d3f6a6 +:004310fd14f999e10b327ef1acd29b908cab30 +:0043204ccc998550b2e0fa3a7b0c40d62bbd5f +:004330f731c82f42bf7e901bdb818561130cd0 +:00434091d4577343f4b2d1e6ae304e479fbb7f +:0043506f1a4cbe6a02ff89691ad4ab8066d51b +:0043605270325fe526618a2691a619112d844c +:0043708ee864cf2c959a5006a35acb87b3e237 +:00438062881dd2f7ed36a0b436cdc55c13e47a +:004390e83e26c8528d1fe2fc3d68ce5c1161a5 +:0043a0d78abc0479ebcb6d8cbe3f64253cd72b +:0043b08f48fdf7a1e5c67ac409438b868bc880 +:0043c065f81a2b4a7a7e3cd6c660c0549fc2d6 +:0043d0efe2a2d77d251fff3194d8ce3ac94ced +:0043e08e01912f54c6c46308c50070dff340c3 +:0043f038995ecd479a56b356fc8b3b9f0a585b +:004400fa03f5e6bfd047b62eea9ba02888c174 +:0044107de2ab8f8f5b016b92ebbb2f5da7ce16 +:004420e4114d76987ac08dadb251aeedc3bbf2 +:004430ed48ef2f068e30bc7b90103ba8165566 +:00444062e67d230b74f9ecae55a9edbcb8ea08 +:0044507a86899719a9b7575b317c0b97181e7e +:0044607e3bb309c69e24ea59fdba9c93f8edfd +:0044701e6865ccedb2f789109c764e9b1e921c +:004480877237e424635116380c18c963a5ad77 +:0044905dbc846e503683692f8da30bccfcbd92 +:0044a077db39bbd6525f6c2d324a25ce7b66d8 +:0044b049b84be248ca26fbaf29e47dcfb509de +:0044c0bc291c410b23aa7d516308e703390909 +:0044d0d141a4b839bd1866d6beed2eea212037 +:0044e0331788d8d987930d8f941b876eea8880 +:0044f00e0aa358648d3bbb25bb2fd8514279ce +:004500763d77fae2918d781c3d41b93a180eb9 +:004510c422502992264d7e3514ff5ecb269d0c +:004520b2cc56e72dd5e909600e2a68ad059ce2 +:00453021df821eab21c2d7c566e2d296ba9a28 +:004540f15cd4277eebd5575eaec2e0c1edccce +:004550e371971530f15876ba0011ce357f798e +:00456094e4d610d7f9eb1dd30e471c4c36cf9a +:00457048a68fbdb186c9129e7f03578fab806b +:0045802b5153680e3002a095f4109bf193ec3e +:004590cc621d7a972061c8a31f98129a57b3e3 +:0045a0fb75195fd6cb9ee91a949b901f32f8b0 +:0045b08fced77f84e9629a8138604ee1982d78 +:0045c0a81156c875077dbc744de3c73c54633a +:0045d04062ef8bf3a55b37068bb47ea4c44387 +:0045e0077187db5112172ff21ba0a48943662c +:0045f0a0fb814e360b2b5b0b2fc7ebe50f4e61 +:004600525f639149dc55e53b5aaa1793a0347a +:004610ea7f172c414404c0e75d193ef419ced8 +:004620bd7add99da8b70b7a0ba37debcb63f9a +:0046306487b0715d3a927e5c89ad06b60d8378 +:004640b456f9aa64b846d8ede62c330b1ceac5 +:004650a639de770b6790725445d6fdfae28ce6 +:004660f024e6b13eb863ccaaaf151db44899cf +:004670d37240290ca0c9594c61a4c57b0abd66 +:0046809fe69834c810c86196e4fb249f8aa36f +:004690c17a8b026d49bd4b1d249cbb48dd557d +:0046a068d6ad6b362ad7180c294041b53786a9 +:0046b0b6ad9be45824bc5f448043d2f740216a +:0046c03e6dc84b4e4f32fb06be760a46175ce1 +:0046d027e6d32b540cd1423f3db26c24631f8e +:0046e0f2e3677e037db08e0d7166d02347f3a7 +:0046f006dbbbe561279e9b1882f0cc56d1517d +:004700abc18b95ccf80291ed62e84cb05e3b64 +:004710447c47a109180cc541faa5509ddf5b25 +:004720fcdbe28be54ad2562348c321891d73cc +:0047302e316fdf5a30a2cf3766a284b853adc9 +:004740bf5a4cf7318423962b086682eab32bb0 +:0047502115184e9565be081aadce5c981c333b +:004760f3fb37721dfd7d9a8e8d32f131d7a2fc +:0047705dd33340be27119fee38308065283d9f +:004780d4cf1f3f05ab7dde1d903f09cc542113 +:004790048cf76687ce7ae7ea981813a3700ce3 +:0047a01e0f562d41beaeebf542cf2213b88033 +:0047b084eefeb945c2a1375e535f96fc37bc52 +:0047c04156e319390cf37ba0afc10f6762a169 +:0047d014e0b72f8631dea526a51016f736f83d +:0047e011740af785f9d2201bb0ef412c339e1d +:0047f00d833954f6020926a288842c0970e84c +:004800ab52cac2d4f89da5336ad0ea3261b2dc +:0048108db55db4d780b8d705d4f5af78a74203 +:004820a78767fc2c65fc18c3a0d4acfd2f2865 +:0048305745ebb2f113c60da6d63081f3610af0 +:00484091f49410d8a3ab82506cc9fcd63f4034 +:00485004f3be99c86c85e767db3bf5d377c579 +:004860da3d6c489466325b2b788978e8ddb224 +:0048706aa109b687e868d510ed3ee0ef0fbea3 +:0048802e295db2c29c32428452a847fda48744 +:004890cfa5e06574ce55b9a91cebb68241b5a8 +:0048a095529d29a6d8c7c24dc6f3589859db53 +:0048b0ca774d62368d42d3e101562eb4417203 +:0048c001eb1a647a5bb4b33ac0ca759cdcd9fd +:0048d00f40460e312009416107f49b753c9206 +:0048e0d579b68d2376063754b329281511988f +:0048f05617d1cc8081ae25acb7c7881e02a0e6 +:004900e31dfb252f52af247f491842022208b5 +:00491032a5d0d7bee33f0f518709ae1400de3b +:004920a944d4acf68b75db8da5a531b105e46a +:0049307c3ce1bc20786cab686b274762ec8bc5 +:0049405452c5994217d2b93ce46ac6d7c74ebe +:0049507bf909ea767763f0690c71841a00a9f1 +:00496017d606906f93c35f193392eb6f34a510 +:00497028420eef300a6496512782e0a4d55471 +:004980d20cb4d4f6e5dbd9b6227a9d3ccfd1b6 +:00499062e58afb35628ad1785100b498882e95 +:0049a0a7d5c0d1be926706b84d19efb035a913 +:0049b0afc8fecb605a8ba228d67a1d9af12197 +:0049c0ec75956c169b1ab63447bb4c83e852c6 +:0049d0aef5bd5289d26733de0bd39d32d3319a +:0049e08b000e52f5ccf191ee55a851730ddcdb +:0049f09da0ef5cca85c6cff964b3c553a1b61b +:004a0042f88011ea0e714efde209e12d5bcf10 +:004a1069ac01b1726c7f1e0d3c8b3e4b7ff4e6 +:004a20b834c508b490035b0021ac887d27e496 +:004a30b4b726dc5694ef971e442093a34c9fe8 +:004a40c3c2a485f9bc9146079cb585ef721ed7 +:004a50d0e417d32c9373dec660b9baf6d73209 +:004a60271ee674148f68fa2fe10cf3b72babda +:004a7001bba27fc240e773e0501ff401e640a1 +:004a801332755c7bde239d5ae245b870db77dd +:004a9017ec140be4605f1a39907188da8a4b3f +:004aa0f79e58a1d9631f98be4f3cf48c17d592 +:004ab0f2fd22fb5a553b96ae71e5931afb0fc1 +:004ac06a48f357267c2cea7aee096666d1786e +:004ad0567b63687dc89b79b2bf3a22edbd24e0 +:004ae0f731c03a5f48198277dd78cd637b3e43 +:004af021ecfd2767f78d1e485faf72dbcf2854 +:004b00f546abfffa80a547e363f38f33fcf211 +:004b10bb0d3feffb593d8dd3a159b356e42131 +:004b20e6f6cb5d555725c88797642c06f920e8 +:004b3083d5c34d09256bc26be42c12979332e9 +:004b406793952d92d0dd07fad083ba6ab51a09 +:004b504a0ffb9f3b48df2c98282fc48f4f503b +:004b6031cef23b1887e4b4728f26583c5c0667 +:004b701afaecc5366263cae70f96d56a2a9fe8 +:004b8054f5ff9adc4715cbbbe90e2d956cc406 +:004b90e820904b94384b0f33b69e81a17eccb0 +:004ba0e773b60bed479adb0826facb4fbd4887 +:004bb060cb77dd9d561279d2ebf70d6a37889c +:004bc0cbf1815c5da958e9499cc3200797039f +:004bd0d81fa75c8798855d6689722bb4bd6b4b +:004be0b0b044b1fddf378e2e4cca18ea220739 +:004bf042787e72a8ea199b4d3587a963a1a610 +:004c00b410dbbd6eea1d6fb6b889f383578dd9 +:004c10c946bd41d662cee076864a57d18bdbe5 +:004c20e2f48674fd19885dee7db31dba316f33 +:004c30147c38edef9d451dd320834468f304c9 +:004c409ca11971edbbcae7e7896a33460191fd +:004c5059e56de180c22465493f967f62b64fc4 +:004c600a80b2f816546eeeacfb09a0655e6cc9 +:004c7092d85111c76d0aeeadd44e5f6407d8ce +:004c808bec9a321c0815fe9860839f805661b1 +:004c90b81ec377b384892e1f86500120ff08f0 +:004ca05cea76a2ce49a3807991381f7ddc97f0 +:004cb0f9e8e1ebd32287b4376c0fbc44eab2ff +:004cc084ff9b82fcd5c8ad6ca17762be667bce +:004cd0e165c0c61dcd185164fd9c6f682f54bb +:004ce0bb19be27b2ea3d1bb83b84e86720c1da +:004cf019d5c6b9bc5bd21b1193f5a0499d7573 +:004d007bfa7ee7204f046a3be279f8f93aad23 +:004d10268734bdcf3753ff4b1313096a42eab5 +:004d20c1e3575e21e28ab7521dbbfbac6e693f +:004d300b8dccf0a995e9e8238c9a6efabf180a +:004d406020dd41e99f2ad62d96400b9b6c1633 +:004d50e1f5e93bd284b3877d111909b79861e0 +:004d609e00c67fe172d878f93cb76b51732d10 +:004d7023a1ec2e76782047f5d4c9ebd3ce9df5 +:004d809e2c7fb1beec6b5d6fcb5efb1c3ff141 +:004d90da1cffd24d1aeadeaf3da8c51d7e8b17 +:004da00a99350dc3a9983b3b503b4350469a37 +:004db090b692d0fc0717050d125cc889671155 +:004dc05cd5d4457c49b8f0f40e08ff38de6157 +:004dd0cdf6becbda8491c42d43a116467a39e2 +:004de0549fe3f767a458f624e4b597f81e1b70 +:004df08f285280ff729def852aae40ac246e44 +:004e0015ec3990930249c1ec5d17222b749d1c +:004e1069367b8e28caa836b533f59b7cdb7d9e +:004e208d1e28f0178b9eef0b4cb55909fb0a9e +:004e308204ee662c984164c70dc356898fcf61 +:004e40073393ecff3364a31003b36b5d68be84 +:004e500bab43a7773109a49ee76891acc8dd49 +:004e6027e340b3df90ab4c096ccbb717c48dbe +:004e7079957e2523485b02c6ecc489dafd5038 +:004e809bd495296b769fed2b68a37bb6f73ecc +:004e90b641f562c1eaa4230a1b7dac84ce48ac +:004ea08e68b5b6ea181ee9d31bbc756aaa20ab +:004eb0ed52aff2afb867d78df96c42d5fc08f1 +:004ec0aa59063172b4f2d9de7c101013189afe +:004ed0364201995242ccaa0594778c91a566a9 +:004ee0b5c649ce54c254ec7ce0d57ba4c8c2d5 +:004ef0a6f1396354bcdd89518ded7198f94096 +:004f00a90df21f6612ba0ea12762ef8c8ad41b +:004f10ed11a6eee7e0703a084d50018d26bcea +:004f2011be6d3f841c211fbdc61ab40dbd0237 +:004f30c7854dddc71ad3e1e0a2e30daa473e98 +:004f4041e8b2c22e80e9a5ff40130909d8ed06 +:004f503e3fc17b6d50080107741d851c052bbe +:004f60c60c12c0f43b13217d3a4759343c1d32 +:004f70f15cf442cdef21974c644888474d68ff +:004f8021a7eb5297e7246dbf28b2d8dfed54ad +:004f907d9485c92413a3fdf5bd827427af33d5 +:004fa0b9226fc4ac7518badb5a96a577ac7901 +:004fb0b47f3121306393ccf322467cce560f5c +:004fc0ae320ee32012b415c5ce2b26a471d2b2 +:004fd0fdd945ca46cb21d84373e3429b43aff7 +:004fe069f710b5dc8bb6ab8fe720c41081035a +:004ff03c7117472f94e3da455a7f6cf185f5e3 +:0050004d06ead94474af19391e0080432a71c2 +:005010571a2a0f2a89b5ec850899db3333b8b2 +:0050200d318336c8e969e9bacefc7611e87761 +:00503052dfec5cd089b24b5588445019b1cf46 +:0050403708c84d2d04af6183a225055ef15b87 +:005050a0074cd8688e2b31533cb750ff0aadb9 +:005060b6558c43d7c777996f59b2969d931ee7 +:0050700c94acd408bf7a8edfc1b2978078079d +:0050800f6c85b648faac052729ea762e90650b +:00509053de9e50cc44c925b0766da42f6d44d1 +:0050a00de35d45ad58fb71a7481bf32437609d +:0050b0b0cb3321b2e8b4f5ac4b18ca067f5d15 +:0050c09a1072ab3dd0ed7a9303bb3251312124 +:0050d0ab1c020389eff495b6e956823785864d +:0050e091c819bf6d28e251ea927bc7be515b53 +:0050f04e1f55b2ae86fa5e394810951225158e +:0051007f5db70c77e0ffa2d947046d83f681d4 +:00511065c6da94aa2aad546e763dbb8a21cb6a +:0051205a4e93acb4e02b5bffc3f8ffafa039a7 +:005130ad9f70e8edcbf856b027eb3932dad556 +:005140479c699f1d69f7a741ac464e4ab7be54 +:005150514a20349f73e48e18baa50acca69620 +:005160e84b914ae780e896c16fd42f52d4172d +:0051701425100540ac6bf63864d2d87c08ad8e +:005180814c2aa6314d0950966eec60848bc2f4 +:005190ce01aeb9a71cdcad7f0800831670c40f +:0051a037936b427af0395745f112c8f72fcad0 +:0051b0700d80f49d877db7fd1868b556d279e2 +:0051c0b359ba622873e445364a1ec310a91f4d +:0051d021d1538ce4a0b74011bfbfc7ffb782c4 +:0051e01306a757d28ee5d864d90c360d8d88e0 +:0051f02f70e260eee0976c5366b7bcfe7236e1 +:0052005ac2d9c8522b09ef85bdb46f1efe4e52 +:005210c8faf9ecbf1be3ebab1edf6b82049e93 +:0052200a6e14dfa959b8b534d36f3e4690f761 +:005230777fdb100fa8244c46511317cbec17e0 +:005240e4ad6b101850f2bb45719bd68ebafc08 +:005250492203cc37917049b16bbdd7b03ed995 +:00526082e960ab4104733596cadd8e3a8d7f04 +:0052708cc8248fbf252951c3c2b95e045dc916 +:005280ec6d1f7068d986ff733698d64db38afc +:005290cc86a67082060ed02135028bd2f620e6 +:0052a0f691a789463b7f92b5812d62c6b01817 +:0052b00f80f08f44e5e87acc19889174159ffa +:0052c0299fc21fe76dc4135eee9b563250452e +:0052d0ccbd531227677488888a7afd3ae6cfde +:0052e0f7180eeb495635e1b97a853efb20a13e +:0052f0c4ee32331f84501705711b4ca671c3fe +:005300ac39c2b9cd17f8f5e75dbc4aa7deed75 +:005310b155efeb83757bedfec37fce8ab3be2c +:00532047804e1ce93051b416f5b41fd8d149d7 +:0053308eb52aa6aecb637fff22082093451461 +:005340fdb5344c678d8a0402dc720df31f3b37 +:00535081d5170a7f17249af1d37c9dec8115cf +:005360a9fce789723d609e198523633736f2b5 +:0053705e74f74205656e155680213ddd46e0a0 +:005380b31ddf1c2449b7bd96fa6425db229300 +:005390eedbeaec901db559130d2eb263e1385f +:0053a0eb89f49e36d5f93b4f141867539d0f1f +:0053b0cd5f6309642fa0021e1bd0821b0e29de +:0053c01eaac7b83149c811cf705c02f9af3098 +:0053d0a5aab333ee93b553610043a75152e31b +:0053e0d48ce7a36cdef341832eff303d10bff8 +:0053f00dec58238eb62fdf73537a93929c3a9b +:005400d8118cd63c971734936e81e0110f7443 +:0054108451cde186aaeda32dde06bf781b3ad7 +:005420cd55c30ebc8fb7afef6113ae0cd2023b +:0054304aaf23eb6be985e4a0ea852b55f6516a +:005440e8c6d02983b9eb1d5eaf0de53e040756 +:00545055249b10f70c447e8fa701755f133288 +:0054601bb86bab8d86172a78523eef325a6824 +:0054704710137b02031fef858feb4dae0ab02e +:005480fd3e7c7f9679797f272d0c623bfa9b64 +:005490447f4a8e311925b1bc7e82de54585533 +:0054a077ac5df0bcddf16612c4704bbe7c29d9 +:0054b06140b6b0969c706d4808bbb67e7f0a56 +:0054c04d60952d556f26ff7edcbfac3f916644 +:0054d00798fdc8cdf2da7555392bb04786d847 +:0054e007deb50bb932b68cf60de20808c464f1 +:0054f02366ff7b5334df5d96fce58e26d81e7f +:005500d25e96633395034fdaf3ef2d55d5a0c5 +:005510f7189c51c53d975d6fdc587c14abd16e +:0055206bf7fd6c1439e318e1aee76b31063805 +:005530e0f6127a2b61e6dfd111c1631dadbc27 +:0055403e1efe27f75dcdb54c260d484afa3fa9 +:00555009706b58232dbb5de2881e80342cd949 +:00556051d1eb6392566419e0a6f1c14b1cef86 +:00557064039a57869d6918870e74aeb1ac13fd +:0055807b51695b60aa3b1877e3a9e820ce9643 +:0055908317789d94a6080b30b60fbf99432618 +:0055a036b729c01231d24e429b74fa698e5e33 +:0055b0effaad749772fbb50e3a98b5edb3509b +:0055c085f99878af12b0c81b21a5017e21c2d5 +:0055d0b3c87068907548740b52d8335b581af6 +:0055e057e9fce6e73d216e5e641443a5adf4ec +:0055f0b703022713f8d730b509837338a15466 +:0056003df6b7fd67768e90fcb160de637eb980 +:0056103600cbf8f8b761de63fbcb6cc78dde2c +:005620042ec59a6f4a44ddb7ab9db894cd5a9d +:00563023053ca49583c1152492867a4be05d2e +:00564086f29f61ee1a6695a38bb415759ed62c +:0056504f7a79b92627fe1b12a8c1b9e1e46f56 +:005660ae039949be0375508088dc7d8ebba059 +:0056705de716980a872740833d71600155c562 +:005680c56e30db1bb7bf1643a9d7215e064fdc +:005690f033158ecd41b67067ed285deb4bda45 +:0056a0ab3a18dd0d9bef620985b26c0e4038db +:0056b0e66ff32c8544b9588949802c5a2530a6 +:0056c03ed3799aef1426c6c5842513e433e050 +:0056d0e0e8f5259aad7fff846d2651d5b21bab +:0056e054cbaf7e6bedc27c17e4ba13aa0d4e52 +:0056f0a082d0809a8f9252bdbaed1a23ac5308 +:0057007cafc434630b0ed26e6338120314c3cf +:0057100395e9d522b5958ce8831781bcbaf6c3 +:0057205e1ecc7a73970ff9182f4261c6f02b17 +:005730d4c769f8619d132501883558e9a90490 +:0057402519bec3b5ac7b563c4d3bf239572d85 +:005750509f3e1f7649d81dfbdca87dfe67c5e4 +:005760e7df4bfdbb59ccfc4b04511b570e5d2f +:0057706b9dcba077e3bffaffe06f2f0438cf6c +:0057801b4cbf838127f5a0e5d3877cb4c3a426 +:005790267382dde52d3c19cfc4b2665694dde6 +:0057a012b308f0640802e946d5b800ee25350e +:0057b02b739c6d951dc7ffc6e41bb9cc36089b +:0057c01c91c7176692018ab437517411020365 +:0057d0aa18c7d06b06d72d3d8fbd6dfd1af654 +:0057e0fcb036651fb6111193d86bd94264997f +:0057f051f679d4f1784110fff7cda90e262855 +:0058004bd61ec4debfd45820832f4b886aef74 +:005810421fa8a3058ea72917a3a04dc1e4aabf +:0058204b6620609e734ee739d1adbce71cc9c4 +:005830bf2714d0ec1c71633a21cae2da983a69 +:00584010ff0aae07e9c1d6ac5a1c0c7b0617be +:005850259e07792c3974dd2b7229eecac89f02 +:005860a4b7693ca8a6851020b4b1f8ff9ee6f8 +:0058708ae7af648307a5eff8ad2f7494b015f5 +:005880c30f4ced65065e2a3ef601cc4aecb4f2 +:005890fec63d432e2c1884c18f8de35daa6eec +:0058a058fa3c98aaf9b5f94f780b8491760c95 +:0058b0290dc5c14f5ced5c0793dba80b282e8e +:0058c084a9188e35a155475e11b0c7dfd13060 +:0058d05ca44c64dd772cbab1b95df35bba28ed +:0058e00d5ba64519941be64c05138a3feebce0 +:0058f016bfac05a126bead534bf53b11385c78 +:005900108400480cad445332ca7012927c4003 +:005910922bfd0d3a9e74a22a5ce84e14677345 +:00592041e62fe3549b5bd7cff13b12081a7614 +:005930548d22891c2aa90d06ad2b98fca08942 +:005940b36685c0b920687e6dbd8b9fd591440f +:005950e161eacfdcd0746cd71f44151bb6e965 +:005960e0298c6a835949b7ce1b4b68610bda59 +:0059700698445608054412a97308512119fedb +:005980f7e48aeb359add60db8b571517554a1f +:00599079277dd11382205ad3dbdda427ddf615 +:0059a003f0e53a9fdd43f183b084edaf6f61a2 +:0059b07bed1a4b0024bd46cb45c85470280430 +:0059c09efef8d0b4b884aef701253b45ef3565 +:0059d0a49574327a6e0ecc3135035a9ec3969d +:0059e0f9e14b73c32c0cbc2bb93059168e55a2 +:0059f0cbb1d34f354ed8ad962f8b610b999258 +:005a002700cafa5bac6668a2a7bbb7242f16a3 +:005a1033f203eac991da8338dbf2026bd4c71f +:005a205119f49e963c4eb85242af788759fe3b +:005a30a740cea21e3bda03d09d5fbdf7d174a0 +:005a400398edf42e3de254e350d62793d86f16 +:005a507220ba617e5ee8dcc6c4fcd76c5344b0 +:005a605f993032dc8c1dc5b6ea1791e0142191 +:005a7074450983677e826ab2c8ef52dd75edc7 +:005a805ba70b9372032679b186c7da842cd8bb +:005a90a308eca372d86f5218a03f8e4fbff176 +:005aa0bdb328a009fd7ae6b3876ad40e4a57aa +:005ab0fe4a4567f47459417c9e1dd10d9412bc +:005ac022194e98e646442f0aab58ca3a37ebe5 +:005ad040bc827259457fcd7d265dbeccecb53a +:005ae03f7ce6803db85df768e6dcce9bd70f34 +:005af01a9cb93a12dc1519ae0ec94a66e18b38 +:005b009223481f001e15131f058c7837d50b4e +:005b10e69330bd4d9c59a8d4b7ee5f5253e486 +:005b20c360163f13987e68df784b45f00a4a41 +:005b3045437ed08fc9acfb118612c5e5264fda +:005b4006bbf1b99792cea8d9b3f82b580aff1d +:005b5029407bca4e29522973c1f1721cdf4db8 +:005b6028c69e2343cd50f3aa54230cb71d7e28 +:005b70c817c50e755d042f8b8eb9a8fb2efbf3 +:005b80186d017debb2104ce04c58f48e80c90c +:005b903132e99debbbefeabaf8d2a407096658 +:005ba03093096ca02086efb4c09aa357a7c679 +:005bb00d95a9c66d4f80b4d68adc14cd1f2abb +:005bc066d17c83a7a4471b1070ab6e8907358e +:005bd09b158a012b198f18c2dce8cb936b0f88 +:005be07631138701affe3c51b52aeafe6dc556 +:005bf02478cf4a3076d960ef7b2a5f8f5e7dc2 +:005c00b0a8681f979a1b0a73d6e4084c344703 +:005c106ed554ff0f5efb2b90bbffac2d38c036 +:005c20e07307749901f0838efd08546fbc551b +:005c30028e525564fdca62ac6bd617407196ad +:005c40801a05d0a05af2e96233182177626df6 +:005c50471b871b66c29e8bfe427e35963dd5d8 +:005c60607decc986d8b00d486f383133a9e771 +:005c700b464c4b117f4f3046282760c165229e +:005c80131206138ffcdd94503fdf5d6e8cc3e5 +:005c90e8c5ce736aafe0af2cc9c623eb3b55b5 +:005ca0e2a5349327d00244b48faf5c16319acc +:005cb00a079b722c1864edbd0b5e3243109633 +:005cc07483bbe0e122e6aad32bbc39a5b7aee3 +:005cd0f1a099ce2943a0a8736026ef518884fa +:005ce0cc28a508bbd622493dfe96f26d51dba9 +:005cf0dd8e0be7aa7a7ec4e1bd0bbc02bf8872 +:005d0051dfaa7c474dbf97ac409c4c1584f039 +:005d10f71179ea92b11dea2ee42237cc4a7c19 +:005d206bd988d0eff28ef932486be7b7b625e6 +:005d30192fb273c88cd71a93cd81032d1055af +:005d40ede3545e647c7f4cb0ee6cb08fc8bf46 +:005d50d51d4dd20ad897b569f3ea0d16f0767d +:005d603b777b6fec36c2b0ef15acc2add3438e +:005d7076cae1a779f415772a8b330c97167ab3 +:005d80943fe36c8fe580c27ba9aab5fc151c1e +:005d901e053383ac6bb6015c5850b7085b98e4 +:005da0216ef05e8c21db11d390ba9da211a002 +:005db0ed8ea38f19f2b602b885ad85f955f47d +:005dc0c0397bb92466040f73561513575d51d0 +:005dd04e00a13a7e7479cf04bf23d094efdd4d +:005de07295f5d71f9c3968e5e2c779239d5c1a +:005df0de5bfb603f57963c86596bd21f24eddf +:005e0021aaa3dd01865a1ae4c6600438476852 +:005e10bdf1ab59472e59ef416669f80c1062f0 +:005e201b7e0d1ce84c53df746f3161f8ed4af8 +:005e30b03d2491d4595e4f5120b448a860807e +:005e4039fa1e030efbc7d2d841c53233002db5 +:005e50b977391e84d0622890b9134a8bcc9e75 +:005e60021b9668d46583cf5e4fa1845b3e7078 +:005e704024e9fb004f1289ca156808d32addfc +:005e804387a6936d68bc6c87f8da5c45b7a55f +:005e90ce8e232308fa0b79b68467c2c1cc063e +:005ea07282791c45e80eed221aed8ce0230eb3 +:005eb0e6f12f777dcdabd5e12281cd84cd12b1 +:005ec094f801533450e95eada350228c3aca0a +:005ed0aec65fc1a43dc510a81cfcebe933296f +:005ee0c6879e35a06358af59a1e2e2dc3f2217 +:005ef09d0ecfebfc47178b1f781449954e840e +:005f00aae9b75eb7f0b90c0a83ba6240e6b29e +:005f1010efdda4eb660db8a0c797eacb6e49d6 +:005f2097b7261e8494dc09c9f1baa624327235 +:005f30987cf6451168327512b3bdde5a569787 +:005f40698f787ede7e97a82b42d3d01fff616e +:005f50fbc266372924c6f66a9affc2a5a39eb1 +:005f60af3732210961e3d8fd58d2dc19e613ba +:005f70d86a8741bbf9c85c2c75fc0a97d77af7 +:005f805ffae1035e20fe506952d04646114757 +:005f9049fdf51cd53d6fac59974aa087fde7a7 +:005fa0d2cb11c9bffbb3978b239e1e5eab808c +:005fb08ba75743b9fa9c1dbd7698075e1cc6d0 +:005fc0daf266c107661342d7b0db0939e59bea +:005fd003d4ae3fc1c36cf5cb075e1863758414 +:005fe0398ef23ddb82992fcb0b8f5afb30e483 +:005ff022ffc81715d52ee30ee0d97613b38f95 +:0060004264b9966dea972cf3183cdfe2bfd202 +:0060101af7e876958c2ef46c33871cd5d02d0f +:0060204bb8373ce36eba4c67d1762bc2f8e017 +:0060305416536d2f7e22c4cb55ad145fd50bed +:0060408951798bd7d4d0de390cf1120dff2220 +:006050e382435847f57d64aeb460f86b8a5626 +:006060e8beb088af783ab70181be115d53a2eb +:0060707f4bc82cdce41f0e2398df54ea512f20 +:0060802d7fd325ef4e46a7b43175062a62f0ef +:0060903b541141dfd56bf10672adb323cf30ff +:0060a0b2d413bacd945c9636958b591626aa27 +:0060b0b9b373cd0173d5ebd6b4a952d4c5ec11 +:0060c08e06fecca8ba45b4196f0905e4c022c0 +:0060d04d17df67fcb7fef2fa73224303437733 +:0060e063a751da6ad7e125098a33bd411b6d8d +:0060f0537669a8494e45bd2bbe44156c419275 +:006100f19937885da327a3a6e880e2d64868cb +:006110f2c854b8c0012817a08f1996fc78cac3 +:00612004c338ab6a24c06c4ef697bf4752a4bb +:006130368e76cf599c3b19df043d42b40bec48 +:0061403198c920e6eba85de3c472c24b96412c +:00615035394d86145c2727ab701bc07e6e04a9 +:006160129eae6f40cfff0596b284fadd3b00b1 +:006170d8cc49d9adeba6b3ba28fccba889ee5b +:00618099dcb087a5544c66ed53aba0f991d30a +:00619090ddcf0ccfb8d0b342bcd7acc80eea12 +:0061a00460b4879838f29a30afa01db3920a09 +:0061b0be748ef79be70b14ba9d0a8a015ab535 +:0061c0114fdd49f04d9cf4667595797b81c4a9 +:0061d00092643a3db27eb6856af9b8f084dd47 +:0061e0ff3320f666f189cfb7c52bf09e5bc209 +:0061f06e31bae0ea2257968c55527392425599 +:0062001a738438b8cc67cd54fc502f68411b0d +:0062104b9c2635fa7b17adc050b9f26c6fff24 +:0062201ce548c62add1877db38660d3ab34ec9 +:006230d025182c3505e57cfab0d95b319b3983 +:006240ac77b1762009c1f787a76bcfdc69c6ec +:0062501b5952f8031b745759c016b08332a1bf +:00626026134b012db7fa5e81daff4839253d52 +:00627081886163c78722e42943bac9ed486e53 +:0062803200a8f82050acd838039390c84d4068 +:0062902719f75206006e9122cae90b46a2230f +:0062a022389f30383bdc7fd2af4c4a1e2ce3a9 +:0062b02cdfc0a2704fdf85787948338259018c +:0062c0a62d136d45efdba03a4e538175620973 +:0062d0742258975f97092817c20d4347c58111 +:0062e057612e35c65e8d52b67ae26752de4cef +:0062f041c282d10a2fb41c668a718b39130476 +:00630051fb942b95197888d65e95938c031cac +:00631073b77a8ddc6b72ce488d4f6fafb2443b +:0063202fef1d7824b5e0e823426b2884c0a9dd +:006330a903ed075744b1825a9add816c36bf8f +:006340cfb5932423104c1b7999c63fa271fe90 +:006350b998c7e3aed0cf213d7de7b52f2c553c +:0063606820bb69cbc76622a9c4bdc363f0d67c +:006370297ccb1f2713796012b1b36b56045f30 +:0063808956669e454ce12285bf7ae9730fd878 +:00639015de69f0ddcee62be8a05e97b2ef15f6 +:0063a0021c5e1bd03c7f6e042dc8ab982cff7e +:0063b0e70d474d546b3003c35d034458190409 +:0063c0c6aec4e2591655fb9add78235eae76c6 +:0063d00ac1de550e6f6914413c8330ec9935a7 +:0063e074c4cd481ef9f7b0a2205b061b49b11b +:0063f0794dbd2684e591dc5716fc0a7b719dbe +:006400fafdfb591f71faa601f2561aea8df989 +:006410e6d3728c7677f67b01ce1e469ef0dfcb +:00642090f54a42e0f8c1a6bc7b0e66323233cf +:0064304f12237391af6666530efb303d6307d2 +:0064409c3bd563e5deb0663e39eecd1a18b79a +:006450f4a4c199a5790ae98e63f78d080ac114 +:006460ec551d1180a32cc967b2f44bcc8db430 +:006470ea535828a11b44ae9ae38cde8ad093ea +:00648082a377f4c2d1e8d2f30f4754d75ef3b8 +:0064900c94ed82749242ad4d8068cba30a0602 +:0064a0bdf743c3c427344fdc04b3a7c9af85f5 +:0064b07c6ff260af71d44adfe1a0a0a3ea1f8a +:0064c046a4dafdc464f4286caa362213c7823c +:0064d0ca3bf72e1f211aa4c3eecac7c49425d4 +:0064e046c1e8e95f55b2c22da2b056a73e4416 +:0064f00c0c0ef86684328472a402cab8167ee4 +:006500174ca0cc9ddb0f3bd6de17255eb12401 +:006510399023ce11a89139405e30f03ffc7f81 +:0065209697cc1fd91d6fe4a07383ac283a456c +:00653088921588fa32e49173ab1cc96f0d9b6d +:0065408b3be51b8959d001548c5858b185daed +:0065508e418c50fe4a58beebb8411cd504b09f +:00656007d7ed43c8f5c1e91a9992d2445ca89a +:0065707365f756ecb62807808281dd253de281 +:0065800261e28ca99a53df5fcf5d1235e5b786 +:00659054928e4f5c907be6b98c7c3d69af98f6 +:0065a0e4a3d17907595f1abede56123b649d47 +:0065b03baea79bd015f8196069dba278718244 +:0065c05458a4ffe28926ca3c46ea9ba8ccd934 +:0065d04f6393cb7789c018f60ed0d5403ef666 +:0065e0f7225a3768643218f514c8595ba5b007 +:0065f01ea780a2bada714fcd69d31c2cc28fe2 +:00660078086cef498bf68cf8d48a697a7d6063 +:006610003c1c7cb94605cb11491ab0f1dc8468 +:006620db05ae46b64f98414e1a3eedf022f158 +:006630356d18442191e2e98517700210036ca1 +:00664079bd2ec0d6dd237c7e1073120c4123cf +:0066509f742682a38698c42b4b8e61a3f83e4b +:006660aa58d3f01599898a008c8521de982117 +:0066701704cd344cd03f4bc118d09a139d9f98 +:00668050e604d7fe78e89026e6d168ba506c73 +:00669021c4580afa91fdd266acc285074fd12f +:0066a0316067bee6c42b08afe6e50f9471a366 +:0066b06315bfad6818fe67b286162f6bdbba37 +:0066c0248b47f7e44663ddaaa970bba443fee7 +:0066d0536b3337fa81821ead5f60a3ab86e44c +:0066e078ade912f6e340acf17300cea95cef6a +:0066f02de4f8fd3bf280eef5d9fb11921b038f +:0067003f2fdc44674cb54bf6d5f382eb34bd50 +:006710387d12bb530b88bac79bce374de2fed2 +:0067201627245e54ec122c591ad47eb05f4487 +:006730804dae92f0f357876e327995ce90c186 +:006740b41e6db7231bff698bc848d390322b1d +:00675077ddc135d4465ac5f39bc96fbd7253fc +:006760fa87189f757535356a69b1f3f01fa404 +:0067705362b7dde70afa529bf086a64ab13d6b +:006780a7537bbfd4703e707c8f5edb500934fe +:0067900130f125b97f74fe8e3eec33390a78a6 +:0067a0390a1f745aabf2fc2691c40bdf68355f +:0067b07fda8a21f010b7aea2c4ab7af044d7bf +:0067c0a9852739ae2d84ce3e3d5fd4418723c4 +:0067d0037d04a604f56bccd1ada44381c7ce6c +:0067e0a84f136323243072770568b922374401 +:0067f054f013d6ee6fff80080b4a55d568286b +:00680034df7c9e7a44e5ed12410c9a4543908a +:006810739dd7a17bc1a507c4bc9bdded526ea4 +:006820d6f0e4f70a1129ca3fc3371c24abe8c3 +:0068304d607482f42ef807583887f7913c1d07 +:006840e4437fca24926cf0163c582ef833aa61 +:00685013468528aa1ac6cad814d0182a05c9e0 +:006860b5eec0b4ccfeaf3be70dfa4e2fc0fa37 +:006870bb60721f72d1a0f3e9b2f7507a5629a0 +:006880f38fa62e48af26d331d6757342cf8166 +:006890ed422524c7c6dd35b76da3b28ae4514f +:0068a019ce9ecd16430ec9b6e1b8642b7eb538 +:0068b062b5ec441980fe127322bf619708422e +:0068c0c2683ded6a00bc89cd326c1c850b2b89 +:0068d04ead26196d6b6ed4e0aca0ae1b05465b +:0068e03549288e9f82fec6cb4877a5d167ca81 +:0068f086321a0bfd65b1f2906e63de98c945f5 +:006900201cc33efa1286f7f6fbb2e4f59e4e98 +:006910c6c6fcfda7628e412700ea5766da7986 +:006920d40a13888266989b9c76fcbb56fefecc +:0069308ac88cc10debfce532e861e587c21895 +:00694008af5c4d472be00994877b64a65362e5 +:00695012f1eb6471c9645370c6e8ee455268e2 +:0069607c1f74efe0e5871a89acdc2b03af9d80 +:0069703d38cb868ace3259d3e7455e104e88cd +:006980ee98328b0d0c08bddf66b0597efadb4e +:00699088d2a40e5be944c8c2e751b379446b30 +:0069a02818f3a39c8904a9d9cfb5c8cffe2dcd +:0069b06773931423229381ef50d1a468f3e826 +:0069c00fa42f6015be6cbd4d9f46bc5c1643e2 +:0069d080fab8cb7322a266645489cf705f2057 +:0069e0b74a4745ba89eb222c49d8be31d7a35e +:0069f079effe436ce7cedf332292ba04b055ad +:006a0017cf717ff885b039d4fbaf5f3cda3b9a +:006a10f83371172c8e61514495e621859ec406 +:006a209e030eb58a019886dba50e6e826f4331 +:006a305550fbb8b1f0afc12590ff9cc6f7b016 +:006a40e21dfbfd2c3e6a8d2d83a194b7a96b49 +:006a508613d64ee3b58e17a1672ac84b8d060b +:006a60c0446cecd09bb744b4fffb4d45924157 +:006a7036d852e6d90de9b45d1a1daa1993b12d +:006a809d2f3fcd6a2a5cab5746ac8dc711037c +:006a900baf30e7f339adc693456e6534f5d45f +:006aa0a4de61964f908ad0968609a1de9e0a4e +:006ab04915ff873129f251ee114952c2cf744a +:006ac057cb50030253b01118c2da5d0e2b3cac +:006ad090fdcdfa54b2ad542ecbc395770df2a2 +:006ae0a739d0f72ad16d3e5a687a17ba35c43f +:006af0aa2b911e2111b91b046dc369f8dc3648 +:006b00b14c56bf8e36d7b0f54583a5148e4173 +:006b1080657608afa3a96966538fce613df667 +:006b20345a7f679aca11c712858c052d8618fd +:006b30d949db488bd9562b503410c1d3441b61 +:006b40405821137e8de3218dc0e60a4f19c26d +:006b50746ed235030db5a1af3c60d70eb6c4f5 +:006b60017ed721799b0d9024f7833fbcdbf270 +:006b70629015f23900c30fa3a9e10ca88e794d +:006b802abbd19258209645831a2d928d0e0ff0 +:006b9004b92878bfd1309cad6e7521e0f7d257 +:006ba0c40c99513c47471c8540dec4d11fe04f +:006bb07cbd64fe4018927a86868ff154930d13 +:006bc04e86b80b8b0ecef8f532ed461da02602 +:006bd008b348d922c694f7691d328de17a4a59 +:006be0216f0eeec603ec5d787804d0bd4d04f9 +:006bf011f458d764ebfe2190cf6280a1be5e19 +:006c0002e8d2eccc4c1b75cb91607af736ad70 +:006c102ead716ea39d4ad7cc229a4ce03ea91d +:006c2063eb6c7403bd90240b60055fbffe0e4e +:006c308e2c62a7d1381a3afc1bb3a0aada49a2 +:006c40863fd965593ccba95b5eb74478658b03 +:006c50cdc3ffd0cc30b05631835af65d3a8714 +:006c60d7fc9252ab63b121adb6b6ad169e09c2 +:006c704baf3a4b6314f8e637463581af62a88c +:006c80be20944573e9199dfa1cfdb9cc0e4faa +:006c904814dc00810709cefd4d43cee60d5c19 +:006ca01bb4a8ec89637ab390acf5f441fda49f +:006cb0e9c2d8e35b8820c471a30cd390405d3e +:006cc0f09e3ba443bc9d3557fbe242c28e353d +:006cd0673950d5b9174f74d67a94c8edc68287 +:006ce093eaefa4f9bed973a4d079f712e70eb7 +:006cf095a4492453a6af5707bdc1203ae94c7a +:006d00818c3a83a7ac28c91ecc92e4ad7ffe3d +:006d109b50b357d38fabb4630f8e2f6e0b15f7 +:006d20d51a523b9c62432b513f064cd6813790 +:006d30b464886075c9a96681028a2fd827dae6 +:006d40380d86fb6ecdfad43801847b969ff4bf +:006d50accd4cf6795ec4ccbea842bd7464f59d +:006d6047f58ae3192795453090d5a95c02204a +:006d709e6c9b111bacc425597ee5ac47b4a460 +:006d801ed8cac16443a732fe90029e507a40ec +:006d9029275c587e645308218e43f0a946ed82 +:006da02fdb7452da8ac2792bd865fb53d2ef7a +:006db07c7815b9a7a440606e7d260dba0d4d4a +:006dc042242cabc1f62c79a44871d96ef20c6c +:006dd0d1ec82fc941e0d7bf762ac44986c7e9a +:006de04eccefb4b8511ead45b22a901196ec71 +:006df0a39edd6cb92450fae2db79fea344d6d7 +:006e0030935a87bfe814b79752a54448b0e50c +:006e10e7c631989340bbaa04fd9b34e40e959c +:006e20e58815f588d5d3616c2569181b086288 +:006e3080bf4cb8d28fb479fb6d182f37850d64 +:006e40ec82ca4da9e0c6ba48cf7a03691b4fe7 +:006e50e0f33937a3c18696e124005cbf3cc012 +:006e6037db42c4131a261ab7213be4bed6f8bc +:006e7070a8feb6fb1f1ff0a3b14344e32f5a9b +:006e80aa815669984ecac871d414c252eb33fe +:006e90768a44eccc5d5127cf0414c9bb23f55a +:006ea049298546d1b5764309fadbf337475bba +:006eb0d888473b19fbd873d20ce43e20b97970 +:006ec00efb40b7d7b65bf970d826294c9b6759 +:006ed02684b5a08b0262501ab2217d0da4c1b7 +:006ee01d3edc90dd9da74e8fd49dd4e9b98a5b +:006ef08aecea74fff903a720dff06cd2fd16ca +:006f002ae66eee9d0a33759b92aeb12121f182 +:006f104fdc2bf09b62c00b4325532ec5f0f934 +:006f204447f26d1bc30fbb2c68ff7530276b08 +:006f3066ddba5cbe8b87b45e18bac9b20ce940 +:006f40464872a01a292f7a6191e0e4347dbe0f +:006f5008a504e0ee4ef7ee34c30d1fcb53c1df +:006f604301df37bbedc0dcdcffeeb4b91e6a92 +:006f703c1400bd7f8a91db1d98bc830c59c428 +:006f8040fdc2339e442799b82426af50576c9e +:006f90721fe896354a630462e0701be663d132 +:006fa0684b1603c42885920ce48d8277609651 +:006fb0933cf20bde4279d58da5004e97a8518a +:006fc033e32a589976e670842cc7d66e6ea510 +:006fd0c2921e4501308a54e4ee027f4308d4f5 +:006fe0e6fb11917a01c3f7f613cc742fa53e5c +:006ff0f663b9be8bedbd368dc7a0f3280dae7e +:007000620e565b69feeeaadb0e4c60296bdc0f +:007010e1a2da439d03fd23e128c9bf45eaf0f2 +:007020b20610c1c9ee4548383adde4fdfa5b8e +:007030f81e06419069bab6f34855e668b660f0 +:007040a9892df13b4554ab95ede026a11eb871 +:0070507b2cc87d2c93f21c91a1cfe8b2b2c935 +:007060d15caa138278a8bcdfcc457352e18605 +:00707033566853c993445d10052a00d70c75cc +:0070801e618394e0aa548f1dfaef327218db46 +:007090417890adf316f94f160c2c979232e3ef +:0070a04405ede5e53e8be1c1c38e1be7ee9ac4 +:0070b0af211a6402df04607035436c5e29900c +:0070c0165bbf261f519c7374e44f7ecff21d5f +:0070d06a15db50322101f6e9f27f8c9a1ef15c +:0070e0b43ede10969bafae58cbcc2561b1a981 +:0070f01a0b33449192e44461583ff0654cbefd +:007100c4a632191bf490e83cfcd84aea915163 +:00711077923f749f93903694bd6a7c5b256529 +:007120c0d7bd23852f9c11a62146baa52f66ce +:00713000ca8062caac7fb808c8f7533f2fbeed +:007140025ac51d8fdd64f781ac32fce836c0d8 +:007150697bb34e7717570b660af282b3204e26 +:00716021f5fe68345036a7fabaf2c83fe27c5e +:0071701c9482884025dabcbdbc6368378e1825 +:00718026fbfb4179491bb96e746c8fc36436b0 +:0071901688ca456f25520199d4dafa058b865b +:0071a08a30ab84d8ac664f6eed2aea5efc6917 +:0071b062f292b00be7f750cee58152b8b17717 +:0071c08faeaab380356f4d047549854ddb99ed +:0071d0073cf929e73c858aab634ce3a3f987eb +:0071e02f221806863267d0a3c9dcb4ece88bab +:0071f095749288a52ad88a03e3db06c6c649c3 +:007200f75ffc582be8ee8c9050bf54ea252702 +:007210ca8accea52adb555bd6972ebe012a901 +:0072206363eb158664f7ace3f82a0b02a93412 +:007230003425a19aea76697bd46f8cb00b4d99 +:0072407537b7a240169177513281f36f018d1c +:007250ee2498aed3bd292039be7bf30e537082 +:0072608c398d03406f7515bcb60be551109195 +:0072704e9ee9e2c1b56ec32c34cc26b960a998 +:00728012defb115f511221749f842d24b73706 +:0072908b46f8fce337cc2013593d077810dcc2 +:0072a02f3610d40c2e13c852612d2470de172b +:0072b092f0357ca3eaef3a90c3a51b6e4384f0 +:0072c01fb437c079a07345b15f3e4ca4f446bc +:0072d05aae05d3f460154e1290ccd29678e5ac +:0072e0cf5f92e9a0ffd1dbe561d93f93d00b87 +:0072f0c31a02faeeb61b6c6e45016fb5948d78 +:0073000742382a62c997ac8655b1bf61a9bca1 +:0073101d3161b215f60becfb28c586c2d2787b +:007320b1867dfa65c7cb3968770e326dbbe677 +:007330b3eccc770e09985bc3be042b0712263d +:007340f49932921dcde1ff2a7b77fdbc5df7e1 +:007350210cc02df3fa74bc52a7ccbf25ba2dc3 +:007360b72dc3e84444b98160477908707362f2 +:0073708dcc93cd31ed1e968a3e91919951fdbc +:0073809b55dd5057fff1b89dbc7b13b1ad9b9d +:0073900b21f8385db478fc74abfcc793e1e73d +:0073a01be1ed62e30d0052adc449aeb89664cf +:0073b02b0533ffcbcd2231e6b883f9c9ff3d43 +:0073c03f2d5412368d68335300c12d0c02884e +:0073d059c921fded6144a18324677dfd991b76 +:0073e0d2b62232135af844800b03920c5f73c4 +:0073f0ee9c01168c18cbe48f5ac2e88ffe1ab3 +:0074001bafb0acfa60a713f9ae7370c52b55ac +:0074109e4c8e1853484cd91f842ecec43892ef +:0074201be8b000581d24d7449687dbcf572881 +:007430e0de7feb6baee4891ddc516df9179d80 +:007440cce5b867fbad92a651e25693a3495dc1 +:007450eb50ddaad253400e93ffeec4b70b62ad +:0074604e3b399ebbaba1ebe370c94f46639d54 +:0074704edada3fc67d917d6a646ecd12dcea79 +:007480b4f000eec3ca88e8a5d66fc4367e7e2b +:0074907b33d72c4003d570393bf49104056bfd +:0074a0af0440e353324eaed3c54f3b72961db9 +:0074b0ead9a43d146e1f2ecaffff453b04a7f6 +:0074c0dbc1e3f21d8fe9eb2d7e3854621d0994 +:0074d0987fbb8995258eba97544dc3f4dc2ed4 +:0074e02c45feb17b5a4a1adeddc74c6eba50ce +:0074f088b5081965d975e4a5a421bcd65de514 +:0075001aa80782c244e5e2b9d56c0c236be35a +:0075100bc45038739d622de29cefc255e30588 +:00752056d10dd697f724b1c296ccfe464c845d +:007530592c8f2f3513eb705b4b67acdbc26a2d +:007540779e37bbe2a3e48f1f7ccc6dee49053f +:0075505b671427aa93d92e6b8a10e8eca7f490 +:0075605d76aeafc2e1dec32f906a11636b1e4b +:007570ffabc65b936795472f33d3c8b9342459 +:007580ab119d509d041af3c5165d50220e3dc7 +:00759050fedfecec8f747722784b97c14b5de6 +:0075a0f3d8cdd45a2b63be10a1382593b296a4 +:0075b0d6a4103faa2989830dc23f56185373d7 +:0075c01e8b4923d850d88f1312629940bbeea6 +:0075d0cb4a216e3d04325e94e12d9426743beb +:0075e03493de0add83ef428c6676bb95558cc8 +:0075f00238389913ae4a0e821d14cdb1fad795 +:007600f59e51e92b1307ce7378fda1067feb79 +:007610ef423aa04a21894e466f52eb76bf52af +:00762095338fb0ea6c247fba47b055d87730cb +:007630a9256f541c64aecf1f283ba04fa1397d +:00764059f2795d448b1345921c3ccb202e1e0a +:007650f28bbd00451398e245bde4e382e16ec2 +:007660bbd9ac24a5c5b71cac30db29e4f9c72d +:007670123e90bed974cfd2e4245755c07e86e6 +:00768055c8701e90965f2eb52930c3ff134917 +:0076909727736268d44c99f79a48f4471a0bbf +:0076a0a0b9f7a66459f4ef946cb7cf866c306e +:0076b0b891df739c9442d7ba450697bbd29eae +:0076c0240aac145f725b2879f30cf5ece13540 +:0076d0a17507879a791105579b966474bcc357 +:0076e05a97d756f31024255aa5fdc6278118c7 +:0076f00f4190e60eaf15cb00b12818f88300d9 +:007700e1257e5ff09da872c4a22e7e6d594319 +:007710c992483e1565e8ad1f671287f0fcd2bb +:0077208a2bc72e55df8848588c4a62dc99dee9 +:0077305aca284a3f25648495d39f9d4f082d23 +:007740dfe2da5d12b8bda600111de0d5ae4e62 +:007750629ba7acb1abbd01abfabfd554fd051f +:0077605da80c49f1584bce7fd15da220a8a29b +:007770d6b8be13163533269435f2e373535d04 +:0077803ddf48b195a68b8c2bcbfb36e3a3ada8 +:007790a07a9bf313489458e37a740343353ac4 +:0077a0f6c085de22016a454f7b778c1e7b16b6 +:0077b0efa08244535304b21111608854921b77 +:0077c07d09dd4d7c87eb031b51e2e50f1aee37 +:0077d0823146bd5782fd3237e563ffebaccf73 +:0077e0912d1e932fb10e769f923f9fc2afad69 +:0077f0d0ea0541f6603d3ffe5975bf5feab947 +:007800bfad4bad45e5fa8f6bbc729d26e51fbd +:0078101ae0f6696fa3ddad4c72af861f521c3d +:007820701aa5f7b41e8f8f6c2f17637681cec8 +:007830a80d433b9e63c4a505b6005bffedcf6c +:007840736cb5f13e9f067713fa66ad52d8a553 +:00785085ec0cd33e6e638389083c02886e6f6d +:007860c15602301ba5cf5671847703be6365f4 +:007870880c7ad75604ff6d5ddc887dd5d748c7 +:007880f3ebb20701477e99cdb28aed5df77394 +:00789084a63b4155248e2f1c5f4fc21b859f96 +:0078a08290a53285bb069c7619226f4381240d +:0078b0508536c6ddf4b44f79dbc845141a25cb +:0078c0b091ffac0f0410446df90396453fd8a2 +:0078d00ebbef2db4d9cd2b95c8d9794dc55393 +:0078e0c107b53f370d3a3af8a9206fa1f24ba7 +:0078f053f553e8a38e61c0a05c75c00446b5da +:007900a59dffef6ec3715874c8226b09b35291 +:00791071904116db8166e9342c7db7309db77c +:007920590df2f0bee09b73128ca903d3c415bf +:0079302b7a2c5bfe99b1e9d73ba84021e528b3 +:0079401729e0835284279626171d8bd74f0b98 +:00795076f79923b40cf5a723dabfbc0cc845ff +:007960a00227a9d26e3a7b5ac49f589c1415e6 +:007970621be5c57330631c25e84b0c697b6f8b +:007980d1c7d65f3ccbe0746b09f6a244a0fc33 +:00799013c93013412ad5e9e0a40b117fabef3b +:0079a004501742bc8cae7996b8ef13e3ee9fcb +:0079b031983448bcd707270c2ad29acfa7b94c +:0079c0a9444586b1af0ebe03c21604814f2636 +:0079d03acda2397a6288c9f9be388c7116bbcf +:0079e09531bc420deef0440bb9f68b63ae0869 +:0079f0332240c947e0c81fb6ddeb0bd6ccb056 +:007a00003945d30da185f90784c5bb57405860 +:007a1072f5ae30a0f40665b9ff30a8989e154f +:007a20569c216e38e90716fa40c9475eb16f73 +:007a30caf820bb3aa076c6c8ba7846000551df +:007a4005bf9584c5314629d69801d038ea8532 +:007a509019208935260982bf8214686ec06899 +:007a603882157a9f1584116ad914d9d4e9039f +:007a7026fc1999d798e04535457fc788f02af9 +:007a8008b666ac225bf9da9e1994b5cc5f49dc +:007a9022fd32919b8368db0de34693b2144f6f +:007aa00e7058e4039452a2392c197f74349a76 +:007ab07ececac561d86ee023e786d35bf50612 +:007ac0e1832388a0049c37626e8d57dd060d54 +:007ad05f0d000f2447cd54e8b7f74e07c1d711 +:007ae0d988fbdc67d27be29005fca1b9ffc95a +:007af0fb878f295b77e2df0a630bc8d96e1556 +:007b00275d213fb33252f1a0fc15168d401acd +:007b102792cea6c279f85abac1764e29dadaf8 +:007b2093308bc39d1bd9fc374c0b00227bd51f +:007b3039818e1e71042000b20fb2b64d32f63e +:007b4074ad7147b2fb28f26650c6be521501b8 +:007b50de0cbfe02a4b4626faf2768ba4dd8d25 +:007b604e39a86b84cde96c251c13c9d7b696e0 +:007b70e62f4e5abee0135b790c5d06b9e99f9a +:007b80c42d175de162e3d6ed58fd4239924163 +:007b902fd990a833a74b9a95e20de97e61f885 +:007ba09105d443975a8b67dd14d3ce6f03207c +:007bb0b48a678dafa85e8c49e13e3e843ef5fa +:007bc00d6fd7c35430628172dad20f80109958 +:007bd0115625a04c70ba2291c6b32d5c2d2a5e +:007be0d277aa81f17aeedb00fd4fb715283d28 +:007bf057ff06e59ee26630638bdc53acecd0fe +:007c00bf38999b442f897ebd0937a3b4a648c7 +:007c101b6f05235d349a847fe1b669cbc01d75 +:007c2000c42e68ab3e041d49e498f27c39bb5a +:007c30c52b7dea5d77f81ffa311673d549f06e +:007c40598c979d228c2d2f35b4b45202457f55 +:007c50e4f7c5b7e63876dbeac6f57521fc6325 +:007c604d9b45ba1f68a2c2a3eadeb6e8c40396 +:007c700f07521dd7c0227f1cbb2f2a0f7134e0 +:007c802d2ac2eaad5b0fbb117f65104ad2e7f5 +:007c901d73ea9c0fabc46ca417b90ea591e856 +:007ca0c607b3cfcd920c85c0e3666a8ed8a9bb +:007cb00ef1de08151118bd59b1e67a29d1bd52 +:007cc005a57baecdaa6ee1333c2e29470bd97c +:007cd086a1f30b207d74888d9c4b002d786437 +:007ce0a14191163e71bf25eff8e6a8036cf5e4 +:007cf0dec7f2edc0feac7f45356ade884be695 +:007d0060321c2587ba6e8033cf2e80615b8989 +:007d10026a5dab9f6e4bfb225e88942cdd9d5b +:007d20f15c2073b443e9fc0d87a60989a63f60 +:007d30fb43941e20b5d627f671275f94a63e1f +:007d40f009259907e93b7f19932c6c604130f7 +:007d50862c315d259e82348167285a13156831 +:007d6054536332e48004de23ac176a48055478 +:007d70198518770161862f365ede56331495d0 +:007d80468c0386014213109597875bc04e7ad1 +:007d9036dae1448aeec332457c17c85898d852 +:007da0900c8b5c4c2c995fe519e4f22f19068f +:007db04bb371ef2aba255b692cc8ada6314535 +:007dc0fb006f92fca85f46da56b2525c594ef5 +:007dd077dacbb4050edbd06acf35f13a0bb1f7 +:007de0e98d9c72e9513e91324b41af77aaaf40 +:007df0910ffe43ee773c7f16afaadb65bdf18d +:007e009e79f2a7e493ca5e5d61a19d699880cb +:007e1002699a56c93a980e16a12af9b634c616 +:007e209cdb93575fc71c2ecedc3516b9d8a950 +:007e30dc75f2b3d7c9bd97904cd7da4df9b266 +:007e402b6dcba6ab2030d730270177467b215f +:007e5003e8de9456d116aee3a247818940e875 +:007e607cc3225a6cdc06afc84cd5e140cbc9b2 +:007e70084a9a33e828515a99851d2bf23f1b6e +:007e80aa0b67a1cd8112448823265cfecb2139 +:007e900a5f77903cfcd66ed9c4fcb680446117 +:007ea0884d9e244d3d38f3f6b48cfcc1898a4b +:007eb01402f556280d82bfd85a1f309ec4f5c4 +:007ec04ed020e07a6b8fbc566aa9ea8995b2b0 +:007ed0ad8afe924da1e228d197775f47db86b1 +:007ee09184ee1fce3aa174b3c020444524b268 +:007ef0dc22dbd251c5991fb9107388c185a262 +:007f0013a436b3c452fb528b734aba3f9d7fb8 +:007f108eb903a4e9b1ced0e838e0d665999740 +:007f20a8325da5408391fb72f81eeab9177955 +:007f302505c4b9b3b986acce15b7c673721e5c +:007f4067090485a2d299971afeecbed5b50d22 +:007f5005909b54f3b77349373272ba7ace7714 +:007f603eee51078201b0d295044e180e4570e2 +:007f7025b9e2806ec585399b51b4a7df593968 +:007f8030477978ebc01d544477c5843ce30d05 +:007f90c41d68b85c3686f88af68a002ece8f14 +:007fa0bcad21e1d3d0cf4fea81d9010bdd5a50 +:007fb022a621d81bb631121836058f6f2ee701 +:007fc0c6af4df13405bae96fe5719a22d103cc +:007fd03c94c38ac89e9250007cd7359e230c1f +:007fe072e2cf72eb47ebf09b201a2b09ce9f0f +:007ff09a4a583adee94346525629741c612a28 +:00800054094a28c7ed4cbc991db5db822d89b5 +:008010225810be6e4a8c31b9e837aa19c3ecbf +:0080200520502f3f5cb634d54aa42019420b11 +:00803069344cc21d051f8643ee846bd0dc3570 +:00804059e24c3e1e2b8cb7cb3d7241bea57db6 +:0080506c7d3f1dc4bab9504e6b8fbd45fa34af +:0080600e0feae723cf6cfd8a5c2bcc76577158 +:0080704013d83001b627c8c856729e6a2c0c8d +:008080ce6b027c5edcd2deea1c3f606a7fce4a +:0080908f5697e92f5b5ea6965cd54fec27ead1 +:0080a01439ca4c93b731ebd7fb9ed46abdff6f +:0080b0aed6c8c4093759520b31a91fbc1e2923 +:0080c07a856e3e21918677398a85532a997455 +:0080d038f5f8946807b09f6c5996de561bd656 +:0080e096208326d5965773597d2c5008eece67 +:0080f00cfbb089d5330959c627be8122ff2745 +:00810048bc1bd0e5f43b0ad20d263a7fefe1bb +:0081103b298809190b008994e91501c774234c +:0081200e805746f18953a7be240bc9b22d6183 +:008130f8f657fb00b8f0f4e931d1c11093c00a +:0081405d2d9abf1a2699d38117cb3581813cbc +:008150bf6bc0054b74121393055a1cf180e2cf +:0081600a95ae794072e8c9c7bedbacbf6a9e7a +:0081700383e086efb54caa01c6dc1d21820340 +:008180a5f0a9ff6bd0039807e6fa9bb95446b7 +:0081900dfc710e168a076df03897a93264715c +:0081a08cde75a265abe3bf00ed1bfc8b123abc +:0081b0a87ad27d9e1a6d41145b401e0218c8fc +:0081c0510c15c021b3bab48b9f82bdc3fe4192 +:0081d05a847295ba00d7d565c920e7713a9d10 +:0081e0116b76e2e7fc60936a0d984ed7bc73e8 +:0081f0295c59ee11bf8d4bdd7d7089e3d48367 +:0082002d88039ee2dde336ee1f37962cfc883e +:0082108fcf689b2169504a11af5a7d9248df0e +:008220c0c46cb6e8ef97f898d16f0e8f48bc1a +:00823086cb28f51d13dca36475ddb001209d79 +:00824055c129d33de9de06a6a826e30470993a +:00825075b52b0e3692efae252a11176929fa01 +:0082602978f95049957d444f3b3dd146e2c1fb +:008270c53830484017b42ec245eac0cf0746e1 +:008280f141b1ee06bafa099985ad551c4fbbc1 +:0082904c9b1edb5dae7f06603778e61867f756 +:0082a01dc1cdea3abc0d7c0e534ee4e8d1d905 +:0082b0c8b3fa952fbef59a5a9da2834880fdb9 +:0082c00ba8db0ab058bb89a8cda13ed74b8686 +:0082d03f2eb4bd2992c9919701ac89b5e41752 +:0082e06d7d8a70dcc892633501496c85e81b69 +:0082f03fd6d9a4b1713310eb54224b6b06be88 +:00830029e4c75076b5fda0d0646e26f83fecb1 +:008310ad5cd9706716beea6e23dcd8a69cf057 +:0083205f01b156449fc8e5d648f7f3f64e4c68 +:008330a665ad721f9d019a3f3dd1288edc6592 +:00834041a776e830cdc19e36752a92886ad373 +:0083500be2a39759fc16498dbf0da4478c627a +:00836020b7b49d707410783c647c866b8df905 +:0083705a188e7f29faf4250900cd595ac8a6cb +:008380aa258050e50305dc7a38fc91f4b91013 +:00839002a647d62b75e23888ebbd06a283df12 +:0083a054aaf852e74e9914ab2953637596f130 +:0083b08ff14ba7d5643c59d0011b3d551a917e +:0083c0e29fa993fab6148aaa0e4e0f762f68ff +:0083d0fe0ad287fb41cd20a4905e1794964a93 +:0083e0b75b71c42ee04be013c9b3467802d0a8 +:0083f081829725beb61549f50487802b3ee51c +:008400b56a6aefee13253d872450690eafa505 +:0084108d7af860c815ed1b7d9221cc6a411d01 +:00842067f5c97d9461e03fc3c25127f8bf498a +:008430cbc739668dd7019e1173d59866aabb15 +:008440ceee6eb690e1bfbe64a100cfbfcf7060 +:008450d61d04fbc444e2a7eb8e6fe80b95fd43 +:008460db5eca82e699063633b2bb9bcd4be09c +:00847048c5c4ceae4e4e1c3dbd9c5a2a97f89f +:0084801c7c7e24f0641ec7bc1cf3ea69524100 +:0084908018ca9e96c982b48ae824af17c4ec24 +:0084a0282832f7c7b75cf0c6f2c301e3d18fd6 +:0084b0c6d34981c12bd1c39552564d73c38e28 +:0084c018745d60af7b5fa252977c47adda211c +:0084d0402e4189054f0e32dcaff2734ddf2f20 +:0084e0db015c7c1a1a50f0c0a207583fd1a240 +:0084f07589ef04fb83797d62d67df5c3d01cbb +:008500485379fd48605e5c430d7ec7dfd5fa3c +:0085102e78231a53db348246520b13c4fecf10 +:008520d84be5723566b1fb87f0693fe5ed837a +:008530e32c63bdf0d979b9d53474c149126f76 +:008540d44b2cb5091b34d536a03ab25d02b2c6 +:00855022b34cc5cf9f0ec8883e09f4fe2f688c +:008560a0f52f1ee92101143c6953049c931a52 +:008570e2d20d60fe2f7369e2f3e4bd625af120 +:008580ca781109565573c34922d1f4ecd05d15 +:0085902633a43c680f2cf6f21e80258440a77f +:0085a048967cf0fbd728d33485191ddd9abaa0 +:0085b02b062074998eb31b92837ab6fbc18b93 +:0085c0991ef4ed8b2c67cde6e49f2e0cab52ae +:0085d00de21ef117f38a4a4e7af736750af9a4 +:0085e0da89bb80546397dab1d66e555d60afb9 +:0085f08b79a87decc7a06dbf6a9c98980850ac +:008600037bbe1ffff7e359fdb3291c4c91c550 +:0086108508de5000c317fd2ed265fbc39fbe71 +:008620a78b3c51a59d48f83c731818511f42ab +:008630d45438777bc48889712531bd80919c5e +:008640f0427a98a4fce0e86667c9b9f6352b92 +:008650380651f6a059858b871a2d299c12233f +:008660dd8a4767133028e12b418905d1361bbe +:008670426943eaa0c5d65ee1cda46c86a3720a +:0086804c41126945e1cd4ebb209a411b5b3902 +:008690ac1ca79e393cbfd11647a6c150ede792 +:0086a08d69fa578be9acd22bd208d572f0ef88 +:0086b060c2b74180e7f92790dbaec791b7aea0 +:0086c0235505b48589bb07fafe6e168b7146c9 +:0086d05d1e5f3c37a5e39da0d1ac21ecc36cd6 +:0086e0a6fb7301a0cbb5f695e9b0fabcf17383 +:0086f06cabb47a823e573e9b648d7bfd0addd5 +:00870044e9f75874296f3f95fae79196184744 +:008710025cc12405e421138c6089a7cbbe652e +:0087206945634cf11814d1fb504c44d18449bf +:0087308c6ee160cea9bf87e740e2c6139acf1b +:008740fb89908950bb54a3a1da07ad9b361a95 +:008750a32d2b98867eecefcd9e04c10da15eb6 +:00876026a80a2a6a78236b0065ac7aaca79578 +:00877021d0568b67898508015d990bfe0f169f +:008780ccdd1b5f629ee1954e2c23b0a0745aaa +:00879010a0e4b585175185f788fc21f3fdac12 +:0087a0a5b28673e95f361876fc5b50cf69be32 +:0087b0f1657c8d8b3072f8efcfb9f50f9d47eb +:0087c0f116f0ce209d1580060a83051f37fac3 +:0087d08f819d6c1e1ae7277e91d2636a0dbb87 +:0087e05c1cdda362af416072730ec7ee4c2285 +:0087f0c0253a95a9ec6d9d5284668f1ea0c307 +:00880077c2d838643afa932b5daf92f553514a +:0088102a48a1dbb8e3950b4c760452b42a4689 +:008820f8f56a240cab0a0479acb5a31cfd27b9 +:0088303fe2252a097f9862859406aff5d0b3c4 +:00884014b877e480f340330e448647595fee01 +:00885095e66f5efe8eb92e65fec893eb61fea8 +:008860f573101e04a40d05c38164d5174271de +:0088706ff35420fd6c91c872687d7746271f13 +:0088803524f0f7431f6ab031ba79298d795916 +:008890a7decc8192c89fcc341a002e590499d0 +:0088a00ba6853a15c8ab800f20d04a681b6e30 +:0088b050c03e0a1cd2d7d6c618444d15c359c6 +:0088c029f82725fbf71e89624f4fe1faccb0fb +:0088d0b8bcb0616ab71f1770664cd1531e39ee +:0088e0a1f173d690354c816ffacb48726f1bb6 +:0088f0b363ff7c615ef324d14b8003eaca6a17 +:008900d8d4596b2a294a0075879b85f245f19f +:0089102e755fdf956b6b389f56d41c0ef62142 +:0089200eec66aa7a38c125cfea95c3d313ba32 +:0089307fbb1d726b7304f38b88337716f99890 +:0089404c8b25fb8cb47b0758f8efbbd04a7004 +:008950d4e917a0b5af4c4c699406d97d02bbff +:008960929d07af4e1fcedd53bd8e0efec30d1b +:008970633841d4d62d68e6401254c4de889fd9 +:008980a5064f52788c696a53cd5bab3a31d659 +:008990514960fd6c691b111362444fd44a3b67 +:0089a0637517448cddbcd16630aeee647c7dfd +:0089b0a7d6cee13a58fe70c7762b3c3546a231 +:0089c0893abb902f424d71c17c424310224415 +:0089d01ed782d1ad68b2ef9b0649f39c53f449 +:0089e00a6df6ad2aaff46cda4ac23db06d7baf +:0089f049398a10681cee26b90f8ca7130f42fa +:008a00c09f4c0ff187fdaa592838cbf8c67f09 +:008a105053874b392a532902f143ef3c41ef90 +:008a20d35fcd70fd180e89b62f107a8aef8b86 +:008a303c6d3684ccb977b3a2884080b7b4d32f +:008a4029d717c65783aa9e69a8564cfcc10ba3 +:008a502a108d4eb68740573c6a377b760fa1b0 +:008a60194f96e552c4851aff4fcbc4acac00c3 +:008a70e692c66aa777fb6aac6c906955a900fa +:008a803b0622c4dee4ac70420a31703100ed8a +:008a900cbbda71532a350303b7e0581b9212a4 +:008aa0af9a518af3cdedbd09680516f380bb85 +:008ab0464114142c1b70d944a58236c486b69d +:008ac0aa25f28e62af5622196893138a7e9b1d +:008ad0f6be7fc39875a7996fa7ca71a379f8d3 +:008ae068495e9aaa419a4892d1c38f64f7c46d +:008af0cf4752b6a283afeb2bb9d6d092691ef8 +:008b00d93c0a1b5848efc5e2980567ac4d8113 +:008b108a86bc50152c41d9ffe2d0907747b8cf +:008b20dcdc243d898514c4a0e49c7b7e9bca9f +:008b30bdbc5fa6c9ae6cb6a14e9c2efbfba14c +:008b4036fd121a82fa28dbb6f898395cf54d18 +:008b5052a5f4d483bbb1b26f9bcd5dd4918fc1 +:008b6060e55169e56f3ab738715e5b20ee82a7 +:008b709143a0e99813442f589a652b15b8abb8 +:008b80b0fd7501fddd37d760bef84567120f29 +:008b90217a8372e3d37fa4302dfe58a6d8735a +:008ba007274784b379e0475624dff97e83c521 +:008bb077ae9e7bb378b4c5e9c9d68e63d10f9f +:008bc04a1a54bdd2330a4d8d79e73ea46eea58 +:008bd043161cbbcfc3592c0c4ad7b094d976a5 +:008be0b148313cedf7e174a15f5ebae9066d4f +:008bf070fe8d5d5b16fd062375d20fa5888824 +:008c00d5d3747da662d86ba3f3d6691ca97a17 +:008c10f92925bff0d5bcfdf3d74d44d74a4788 +:008c205c657ff51341baf42fb163755d75daac +:008c30a68a6cbc32b1f91f3de313515cb7e955 +:008c40f10b12bb0bcf01bea68709838cdcef68 +:008c5059153e9d29e015032f2504c98fb8ae11 +:008c6028e6757d443dc723953bae81d7a453b6 +:008c70596c37925e8ec5ede90f0fe4d711fa58 +:008c80e623c808aafea94bd0e8050d3c75cbcf +:008c900134cb44be051305ceba128062fbe6de +:008ca07d978632129020972aef5b2b66504078 +:008cb0991f7fc4b1a6f930c4e6f3daed30ad24 +:008cc02e7f6c1da17942e8b679e430e846e980 +:008cd0c35f40530ba8e72e5d050cf353c85bd2 +:008ce0d9648c6ad4371acc989a1ad871bb49db +:008cf05cb3228038f30ff3ff44eb3778107210 +:008d00740f2de73fac6c0f3f6c4aab70fb796d +:008d10c3d5feb3a70f9f799881186230abb036 +:008d20c6705651d253478f5875704429aaf9d8 +:008d30e9a2949a28e710a677b665506dbe68e4 +:008d4003d66c10746b54272171c7abce6f48df +:008d50da967371f137dfea7824e2a30ab77fff +:008d60280583ba357f14622482e8f9f4562d47 +:008d700c69247f06f445ae065d03a41c3e6f1a +:008d8057868f7bb10f5c0d063ea007eaf1d7de +:008d90737da3be2a789eeb0a93df2650e59b12 +:008da0967e5ce5cf0d85ad930933127ef69a94 +:008db089f72fd45049ce89d2c5b3aceeababbc +:008dc0c8e11050731d46468abbe9db56f3ac27 +:008dd05210955920f25b8cb1ae87a344d4cbff +:008de00203ef05ff6f6c675b3ac6a8b9d19749 +:008df07ea495ab15fe1a82c87acdb93db2dc5f +:008e00957ca35545593b2b6df1babf71c3fb9a +:008e10f36e03cd84beaa47804d0833aaf2fc3b +:008e201d0cbd89671752db3741259bdce256c9 +:008e3000546a725c2edbd6ac4f99e7fad215fa +:008e40d00239cab51562e1df5477a1a1206144 +:008e5017ab560f29f7b33afabf38ec00fa39ed +:008e608ab2ca7cb812331f6e33050a422b0591 +:008e702f776f632e4ed3c31838288f2e97f401 +:008e80265a18f0e57815ee79b766b8f1e4803a +:008e9024c25580dabc7bd1444f86652889dd8c +:008ea02735367be1dbbacd84eab9482ef8020b +:008eb03d6b1cd528326a33f9f59dfb85f88dc5 +:008ec0862cc1002dc8606fef1eb88a5a41cd7e +:008ed0390ebee91ec50ee2782fc9bd9043eb4a +:008ee0d87b7512a04d5d8bfc5129c1d91106e5 +:008ef08e87d559e9f530a2b95a8bce7965ab44 +:008f000f85274c377548a53dafd8e9052141a9 +:008f1066e6d9e276ae1c8f3807f5302b60cf2e +:008f20da340c503ecf2bd42b3ebdfcbba24ebd +:008f304a66269c4e4ceb3de26397321679a959 +:008f40b22b973b172bcc1e89be89365b97e29f +:008f5005eaa2f5f9b7cdbe961452b1af6d0f1a +:008f60768bbe4b74693d0ebbcc2696f7f1214c +:008f70aea451a5a57021732b2f143fc5ae0050 +:008f8078aed082b71172a7e8df63421b04e713 +:008f90088e8b7bc22ce85299d831c3a04a6e08 +:008fa0e203c4f000f904167e36a9739c0e6390 +:008fb01d3a05984b1db803e7a606426611c4e3 +:008fc01cda70c513df2789327565a202aa88ce +:008fd009b5129ab568583c495467eee0178af9 +:008fe0bd712f2c1db8ea6bf47fa64ff2f1e6de +:008ff0883acd5a4c9713cc2f08ef15427d89d0 +:009000a6443315c317b6f48063ce1eef05386e +:00901015eeec57adfe37d371884c5e4765c0e8 +:009020e96e8e67563dd780b5fbf0f5f033831d +:00903047de55d60eba6c98d6715457df9ac9b9 +:009040d1039ccc3a4a9f13361f4b09bab28f47 +:0090509b17bec7dcefe3e18c66a26219e2d6ec +:009060d5f0b24f45d7a45f250a0a7f7387dfa1 +:0090708ad6e4b9514ccd665ad64bd568113a5f +:00908012fb90ca087b4fb8324265228b9f7d05 +:00909076e8f10463e70e4a408daedf8b98fe59 +:0090a009259b0f678b89c22669c378d8d4f5ce +:0090b0ea0c33122f6f3a91a7fb18a2f3a2b05f +:0090c0d29084800840f097abf77c579cfbad12 +:0090d01551d64ec1b7192e725d0d811119fd50 +:0090e094bf9d3c4e9de7c63954548396df5429 +:0090f0942b7ed352e20260134f2f8fe90c9db2 +:009100997c38b842a92c4eae402b1d10b9ed96 +:009110a89895b02bc9eeee999ad937e9e63cca +:009120ec307df706ff1bbd84db5c4c76b9aee3 +:00913044e010bd0f2f0919ed7568ae96fa2b64 +:00914053dc3840d313e0c6a56ce893a12b6b57 +:009150f953bf9ad5f534d9a181479836df8e2f +:0091609a7a057313155670d4f7a2d70f3dc371 +:009170de2beb398c512dd4425e051e0f90a12d +:009180e80a41d97728ec9beec6a4eeee26619b +:00919082b35d018429d186f8831aef997705eb +:0091a0131f15d28ac82d1d9943552f3db00967 +:0091b073c73a058330f4e4743e1ed00add176c +:0091c0780b06fd22d776165c66ca9361f511ed +:0091d0fe35db37bf5c9a45c562b2585da0973e +:0091e02f2d2393bddb415f122d27ee163f065c +:0091f0d7ffb13ff2c8d165cddc84b7e1c4d6eb +:009200649dc230e1daf5803e895a5690f524e2 +:009210e6f1c404ed5f020d9e1f5a6dd80665b7 +:0092200de331c2d0b5ba8cdc489c2077ce4ce9 +:00923054b8c849fc09806322f99281931f2a27 +:00924064c0029495fcd22f09380c582e1df9e7 +:009250472970978da9bcadabe10e0b1b46494a +:009260cf428a8f2f2ec5c1ce365f923c76492b +:009270bc888c0cad6609b36c47d1a291866353 +:009280c66357ded2877d282d031bda14a98463 +:009290754c2f75494c134e6f260473a8c76517 +:0092a099eb621e124e8c36e7922fac7b48d6d5 +:0092b04f0cbce5855f6ff060ab96a4a81c7ffd +:0092c09c48cb8c7238906c979844346ac5abe4 +:0092d015710c428a7c761f299bf558f940a8d9 +:0092e0c03f0e87820373a3f0d5271f17ffa094 +:0092f09f3891bbaacc7613cf11f5bb53a603e6 +:00930087bf245251544d3f9678b67f341f7292 +:009310fcb8c410ff46be250daab63ed612ccca +:009320b60a1b40ca53e4a54dd85cd8f9136525 +:00933043dbf27a505274e9f3f8fc672f205998 +:009340094af90e6ae032e34ff1d64d1351cbc4 +:00935005ddbd297de72a051ac75f79e59ce964 +:009360cc15e0eae49218ea1313fa09f2e70e11 +:009370d4fda537cc183d5ac26e8d2ed57842af +:009380eb15cc197fd9d8fbf93736374fe6b673 +:0093901e623f84be7bd26296d6157947851974 +:0093a03085988d2309164d203e5c94e25327da +:0093b0bc2bd7d679d09a5e255b1da2dd38a4e6 +:0093c0aec85079dee460be3f024bbb0d6df829 +:0093d0d31a7530fb41c62dd214a8a2032fd674 +:0093e0fddef79112ca659507c3f45383db84a4 +:0093f06de970f0c8b0cd1ce9718ba1b6e7d054 +:00940073c31ce116f1c31b92cfd313f46fa54a +:009410c687123058ce10ced3b3e92bdbe3715f +:009420cdfbec6e1d13113d01ce4494580b6a1e +:0094309a8fba65570d6cf26d2a9aadfed37af3 +:0094404458168c9b792f5135e2a5b0783ea6ea +:00945037d9e73c60d2773e67d67d1e2ff5e9f9 +:009460d1cf5c9d6ac6f83e9da7d0574ca3dd5c +:009470388761cffde6e11eec9ed7a59e66bd7f +:00948065e0dbee273f2630b96b636b7e2d3ae3 +:0094900dcd28d0c997a7a132b7697abc362753 +:0094a036c0c6c9964a204112cd78ff0ed83405 +:0094b088f90c80d54f35a980f6a091e578ef68 +:0094c00a701f6e7fc494c1cd9bd07de4467b72 +:0094d07b75c830d34354073d8e973fe4a0ec9d +:0094e05ddb29c8851151a5b1b9539566a4ad1a +:0094f0bbf4953bc2a245ecc909db91b362201e +:0095003728f5b49089f21c639cc7ad690d6e16 +:009510600df85e234ea3f5bdf473a6dc620f32 +:00952054ba55fd4c2ff522258d01a715e3720e +:009530a12b1a47fda96ff16873dc16faa48bb2 +:0095407f3ec144bb6d17f0d92791a882925262 +:009550a3da93aa533549cd571b54deaba096a6 +:009560235199d683853ed75ea99b38871c52e4 +:009570933f32a06c0c6673f85f7ae60d125310 +:0095801f4a8a53790e3a52d8fee33b0169c265 +:00959066913a565cc42be63e9734111a7c76f5 +:0095a0898710e7a724317acd62fc828a3abfff +:0095b01ecae7f74b223f751e5436d7aff93069 +:0095c048a3ede42ba0daffff03a12cc761d898 +:0095d089774b3848942dd689ca284c27817215 +:0095e00049851e731da1fad1b78edc464096d5 +:0095f0921c14278da2e0e7855be0f4648892a4 +:0096009ab2f88fad1d602db22f15bbc0a20977 +:009610f54c50654cd4a427f90fc5861bd97cf0 +:0096201ef480b3d50d01bc5b8a17bc687e851d +:009630e3b4a5d01e25edc0d9a58e5660897115 +:009640ba1b670dd9463be731a232045e4f7889 +:0096506907034e1d4b3c35479c08fe63cbcd48 +:0096605edb681fa061cbd981bc072984b80ac5 +:0096707bc120ba28371b7d95f971a2f128fc04 +:00968091357312bd778d9ba07810763df835ef +:009690449d0183804080e383f8459a3eefa872 +:0096a0475dfc1929fcab2fee67c91b7016ab3f +:0096b00d5dc8bc4ba7b863ff8866cf713a87f0 +:0096c0392aff9a3944bb6ab803c3500c6cabab +:0096d0e9896c4ad92d9d22958ddc78c0ca8478 +:0096e0c184a562f19380cea2fe704cacb0f7a7 +:0096f089d32bbbecee62f99275129f0b404811 +:009700400ac5bfef09e02421f01b7362da2d97 +:00971073c7d5fa8a671af3e8a1464b33e4d25f +:009720698bb888235ee65883b788542820ce58 +:009730ee006e9f264b537c23c35383e5514d61 +:0097400fc0bd6481af8253d80264f1691a7a3f +:009750025275ef9af4a3175a577b03c9ea7050 +:009760f33b9f83cc95d2c3bc2251cf6b9f49a3 +:00977013198b54bafa1aac011d4c68472987ac +:0097806d13239763e8230ee2170f4d984981da +:0097900b8f1b5f02875f134d6f5d45e94f6ccc +:0097a0588636d70426caf793569941f147e1fe +:0097b03c839b7979c7484d6b1d3d91578c3fef +:0097c060ae0019537746b8d3bd6b547c1b588c +:0097d092ad2d630c8acd681dbef85552e1490f +:0097e07fef5abb583c7695f3c0cefe8a0a00c5 +:0097f0525a3b647a2a493a4304ca6565471b43 +:00980071b661d5f41d91fe70b54940623e49ac +:009810222ba1a48491fa3c2126bbb4abbe798a +:0098201fd8074d7dcc755ed6c7e5797d5a21d7 +:009830a5b559c7e4a73bc8857a0693e1c6b107 +:009840d16d8668869a4ef1d754b79e0fa29ecf +:0098506e9055f948893e6c399679e489c9d8a3 +:009860991af2f73fb2a8bc41b297c9e193137d +:00987049cfcb0fc2c3dbd050c8180ecd9de432 +:0098808f35f5e1414b547b01d1a779f1584b17 +:009890a0eedc7eb9c6d371a5b0c107862e031a +:0098a0ce8e0d230818a3f932b77d177565f6a5 +:0098b0b15dcb102673bb1feb685e998904e9e9 +:0098c01846f2e3cb9a8f400fdec3b9cf74690b +:0098d0802bee4ea8ec2732d4e60379296855eb +:0098e0a281e803e8236f00c67299475bc96bc0 +:0098f014bc5a1332d94386a3339f7b58e22501 +:009900b20f8adf29d1331087523f09de1f0f32 +:009910d74c08b057fda71be2c5e28249ccc6a4 +:009920a845f5c98eab75bfd0f14e372b80c242 +:0099305f8023d3102d36313423ef2351e44996 +:009940427c778c6dab01b54959e3d3df0f1248 +:009950f921554ce65d1e39cd7e3d12bb2b55a3 +:0099600298a158f70bb1e3905e68c7b7a690c8 +:009970c5713c90e8b631bf607cac5662052796 +:0099803b3a9dba03d46d64be2faecf2b56c84b +:0099903b30277785e7095f5ae094da380a3d20 +:0099a0e9327832c5d201f33aa9c2b51721013b +:0099b0a26e881cfd2408058aa62dd6fbda95c8 +:0099c0ba415d988f86844bd8ce7717063f906b +:0099d0440adebaaf1a2fe3c4be815402f0ec11 +:0099e03d11b313b85060a864da73ce4724d8ae +:0099f084968ece6684d12723a6255030ac1433 +:009a006a0c11d00aacb4d7ad9929cdb516ba74 +:009a1063b08c863aa611be0f57681731a6d6ad +:009a201f586d634cb14ac40a130c5c9cb3e552 +:009a30dfb19d336f9b82617434c8bc2e22ebf8 +:009a40bcd301516a1dc1243befa8680b6b449c +:009a502f68c9b830a65c4f651c54562cf8e389 +:009a60034e70758ca51f784c3b7fd86969a8c6 +:009a70a80d9b99873538743927f23257e1eca8 +:009a80006a3a8e2eb04787495f527d6e49c6fd +:009a90887c178296f1cc6be9937f67300b9b55 +:009aa04a10becf7212985af4ccbb0492234c0d +:009ab037283e15a252208b945d6d2bad71fd7e +:009ac034c31a8e5e1ad9e984d817b7bcaca703 +:009ad0ece441a5318a37305f0f5241b8321f10 +:009ae0185ba26c0cc39511e5750d4646ec7e8a +:009af06ae5abacb1cff65d690f956b5970a28c +:009b0086037a428c1bda2caf272d8e4df9fd65 +:009b100f88d90cc8e82eb045bb545c42ea1d21 +:009b206b779aeb925982dd84b64c363025ef7b +:009b30bfb983cc26d480dacef97fae60b86ec3 +:009b40dcf90f1c084984ff98ec98a2d2aa8b3c +:009b508dadb4590264687ca348705138ac227a +:009b604be24a6f0296123071a86883aff6a414 +:009b709a6a91d8e083cfe18968545c9e13a55d +:009b80031407a44c92ae1e830bd76af566ce2c +:009b900bdef968223bfe0c3ebd6ec3b0aba134 +:009ba0d43a9002d796fc6bdb14e1031c528143 +:009bb0b90f196b0371a25242d59e47a04cbb61 +:009bc0101d31f261ef9f6ee75b17d29e9e7dc3 +:009bd02fa8002102d3477933cf5534f598e30c +:009be0ef63e1751ce45468b191ecf49f3daee6 +:009bf05fa579b213f671b096168f9ab409b741 +:009c00aa4d2cd193753713edd5ae19b03eebbc +:009c107838225ec7678e32520f8aff3fe8ac86 +:009c20f88b20686960ebc5c111529c469a061a +:009c30f25b445d28fca2b8dba89e2a1868a2ab +:009c40fad9669803fed0302d6dbeceb5e96780 +:009c50f79896469048349f4864f8d7bf62065c +:009c609ceddf0c198be2017b091329a5e5962d +:009c70a4ca3530f2e72b8fea30d957d8d6c7a6 +:009c8073513f0f8ce256bdd341a9a4c2cde759 +:009c90b9dd7a3264527ce1a7c14cf9701884a5 +:009ca07ced6895c06465f8002c7580e6f04b08 +:009cb068e0d00ae40f38a82db84c3fdda9ccee +:009cc074381ff50189c71de8510b54cae44e9b +:009cd080b42e7054ce42f9db2d37c3da229a01 +:009ce059ddbc1646450eeaf2a42edd269a6c81 +:009cf0209e7ed7bd89056df384fba400d0a7fd +:009d00d5801d7269f7a806f35485dc2c5f3514 +:009d10f484edcbc19db692d5e49749cecd57c3 +:009d20f32d0415a235e076e21f07f98901c034 +:009d308b32736755bf8bccf9b5b634768cef35 +:009d402b2bc69f4c61b10998bec5a1bb02387d +:009d503818ac05f21824eda7c42cba3f39f0d3 +:009d60c3d0c0f4cf6f922994fd541a31d766bf +:009d70a039484fba94debaf7d3f991c8ce36af +:009d80291cd38a082d8d3f5e2676c4a1cb3952 +:009d90769f8557097fa6f967badc011742a36c +:009da043b2b2d6eb3b4381f6611ed91985f68c +:009db0b211a00dd763daa1deb562e3e262a0c6 +:009dc02e6922c963e65d107cef45d3767f7f1c +:009dd04b107b64f7c49c64a1cf026442d7a2e8 +:009de05f5acff4b2c573d3543f376650c3d030 +:009df056171b2fcf2929ad88d22bd87bcb3fe6 +:009e00b83a7b43037af8b38c64a5f80e2e5336 +:009e10b3df2fab0bf5f8c4526abc02ea10944d +:009e20a668695994d18c95ea4e219cb18832b1 +:009e3009227fd905d3197cb179123e57b8095b +:009e4013ff7e31a2ba91aefb0d23be5f237c95 +:009e5052bdb0b2ccbbdca679331bba62b15e9f +:009e60827c943f893a72ecc10133ebb48c41a0 +:009e70ef28e132569926104bc2895a83f97180 +:009e8019c6d4fef3682dea181afac914fbbda1 +:009e906a2d0db1cf602b3cd7ca0774976735c0 +:009ea04af23c380ed7a05bc84dc8f5b0ee002a +:009eb0114549d63ede3c9dba3bf00790b323c8 +:009ec0f9811617e6df53a7daec3d78f8e00496 +:009ed04a31518afba1db2229be6d84d7671a17 +:009ee043699c8db290b02b4fb800fc6d8a2ed3 +:009ef070af17972400fd4e18b5957be6b8b8aa +:009f00bcf3f0400f2f7f21a220129ea18c3c39 +:009f106afa059a19877a532b6392304fec5aa4 +:009f201aced50a30f988066783de2848e2fe06 +:009f30615a0192e54686758d16a1071953c621 +:009f40aa67fbc5f59022dbefa919084743ed1d +:009f50f61d743066048b905a4267d836780ced +:009f609a0cd549a98b43e9e3c6ed3d7bf579e0 +:009f707f55945496946fc7ef43387b0ea280bc +:009f805a8d0e8873868b51a1d6366db76c4597 +:009f90753f9ce200f0035ed4fc7bdf763fbeec +:009fa03d774ba2f4be95f89b35c9ec96d4917f +:009fb0c2b19bdc5ddb3aa6506e84db5fac3457 +:009fc0e28c25721095b05cef2560f4f0b075ba +:009fd0ab3f769631a51a69210abe43da41ed47 +:009fe054a637dcbd1c00dd915de6a9b75669fd +:009ff0050116822c41c0284dc333a762b260d8 +:00a000172f13eb3da6174209dfd8093ce286f7 +:00a0109d31a4ca7162eaa9338d111f3fa03014 +:00a020d12af5193a1cf98a551bfbce92fa4fda +:00a03009e9295d469eb0bc72551e914fcbfbfb +:00a04065e352f962dff382e8fa3b0d34a57730 +:00a05038febf8992ce2caf5d5aa463cb3f425a +:00a060c354deddd22ce82e1f2913c9594b6f98 +:00a070114e8fb89a39bebcf04753c58d83b1af +:00a0805697c276992d3849c9aab32549b4714a +:00a0904633e21d8d65e8d84e2fcd87f33ce9a0 +:00a0a0ec25b8d5bf1c1826f914ad60a5491b23 +:00a0b006da30b4bb009270a6fe903c8ba24404 +:00a0c0cbe7feb9cc2bc52dc50fcac7cd532dc9 +:00a0d0b18f706d82bffde0d6621d348dfa4693 +:00a0e09d21ce38a5cc4399991200500bcc4248 +:00a0f008c32ce79a19376fa9681ece4c475509 +:00a100695ce049929e726e44c5badf5e42a3e4 +:00a11031cf9f00b71a86e2919850ff53a3e46f +:00a120914f3b06c41b4fca44c33936d7f0820b +:00a13046c32fab9347d357863b528e0377f297 +:00a140beb24cbbc1fe05ae745c48d364a19cc6 +:00a150030e2c89bed81d75873d66521d7d1a94 +:00a160d6e5adddf8d1ea9b5fda7b4a3bc0dc71 +:00a17095895811f9bb67313da853415bb385fb +:00a180e84f195e378444f4f825f9aaf6872796 +:00a190b453edb694e755f578dbcac158486700 +:00a1a0d5bcd77c255754c5ca0f6eef1d7c9eb5 +:00a1b0c466822098ec9bf9028cf3089107ad98 +:00a1c05c70c29537844193e42601e29bd7e4a0 +:00a1d0d9d4b1d85bbfc2083849923233017c4c +:00a1e0a39d83416594e4875984b8152dee3f8d +:00a1f0267e65a3a59d1335a65a2af7026cbbdc +:00a200c6a0350f5360236bd849ef381b516f5b +:00a2104e7956ce43d82ab0e9f3183f76fcaef8 +:00a2205927f153fa68d53a25588f0feb896f78 +:00a230c476de2a6dc2c99cea552ccec64449f5 +:00a2403799885368adb5800016188c1b524fc6 +:00a2509a97ab7997d460d4586f1f5a8ca8251a +:00a260ef502b296f7b1d0bbc46b6c8dd14ed27 +:00a2703cdb3bc5e5d818a7eb599adf9064c42b +:00a280a9b7dbb0277056736846e8a0f29bd3ec +:00a290345b2203c2fdf0377a8115b06f7d7c5a +:00a2a0df8f8289d4a01a58effae9d30608b7f2 +:00a2b005735bbbd014b6ebef4c12bce84592d2 +:00a2c0e517d1460a5e2308add5222a3b32b386 +:00a2d0900b58e4355f298d1ebbcb48d381e5df +:00a2e088b12ec89fa6681ce1887dfdf54148de +:00a2f02170aa1dd2b6535e7f149110a2be5ec9 +:00a3005d9688ddfb98e45a8dae313f4a9bd10b +:00a3100e0bc437cb8a16b46a0420aace05d1d7 +:00a32052c14d40eeb95385911fe0bcd3883582 +:00a3303d5fce808d9e324075e05c8f8f494dd8 +:00a340c3cc8f2466c4ae1a946591d7a89d32dc +:00a3500cacd9f9a81b7746eaf2524b6bd8571d +:00a360dccec3195e6e30b7ea6bb33f879aa610 +:00a370ea707bb8216db50ae5d5b04349edc96a +:00a380ba94ed9c12f2f047b6fb50666908bb67 +:00a39051f6e8cd96dcc9107ae0605268b82888 +:00a3a068b9a004f88b761b7a4bc7ffebec6bb4 +:00a3b030c346dee4bbbc8cc2dc6f1ba2965ed1 +:00a3c0f9ec6a3662ff76d3828f7fe2eb7cddd9 +:00a3d00933f14ea30b7304dc6bf7b9896dc859 +:00a3e0b68e37d34280a0f7725af7e0b858815e +:00a3f0fe9c8d8902bf07f2a8d5bd93cc2ee89d +:00a4005dc41175be54f92b5b07805c62696469 +:00a4105f02451a71c3698a950eda9f152e79eb +:00a4207bea4999a462a2ee8803dabc1d8c4a51 +:00a430d421d6bac8d45329d95544f022168399 +:00a4406c4cafc95fa7211c60179d05e53a8006 +:00a450f39aa0c82bad63d7fa31a567121cb724 +:00a4607921e8867e8f592f9f62ade36eddc823 +:00a47031a5876d3875e640a7c6d058d28953a8 +:00a48075e28e1fa929b7cac1cf9be87e0dc1b3 +:00a490df2ef745f63ef7e7ac436bd1bb502d05 +:00a4a0d2d6c0b58bb63f698cb641888de16979 +:00a4b012acaabdf2cd89fc7961211e3afe61b8 +:00a4c0129bb2fe07b5188230c523afc2909567 +:00a4d0782995441e3637bfb5b3f6ef2477e00d +:00a4e013a307156b7c6652e101789af948159e +:00a4f053e38e707c3d45869d8b9f1f544e2528 +:00a5007451da51f8a0c987cb5667052d27304d +:00a510e1df3346ef8f6a118d4ddb3e254f3e35 +:00a520aed91ae96ff0d87221290c38764dc099 +:00a530f630f75a47fbfd489e6a22a2eb994234 +:00a540954167907f380215792e3780dbd8af1d +:00a550c8f540c8589779d5123f14d47e4ae6c6 +:00a5607318953564df36f282702605c5f5cfe0 +:00a57040e063c91e404c6b964ec662678571f8 +:00a580f4f9932ec35b7c8344fc0bb7068e8aec +:00a590e6ed845194038d7bf29f4db8cfe4431a +:00a5a0e21a02dbdb4178f971360e36e7c2e861 +:00a5b0d17da975e958a033be74790713773d8b +:00a5c093dc598677ba8f138fcd1cda6f42089a +:00a5d0410f1039f3800badbb2fb901ed9f0fe9 +:00a5e00fda4a88c055793fd6e03f33e6b6301f +:00a5f05544450214b00784969f74ea605fce3c +:00a600e7c0c11cbd6ccbad8afeff95d1ffba76 +:00a6100541e06b3b0e30956853c332f3732170 +:00a6202681b74a0ce7381a56dc1de192eee153 +:00a630ece8633d68f7194aa2a5239f96b75ae3 +:00a640a95c60879c344b0e29fd25ceb4750e2e +:00a65007d7bb3efa02df0bc0635859749eeda7 +:00a66000fc4d52fb85e3f61b4508636ce1ed3c +:00a67021d473984546ba54dfbfd655de18d322 +:00a680569830cadbb711d20f1b3963d6061b5d +:00a690dcbb3a9c3b0c4eb61ad446abb61d2dce +:00a6a055a377db433376e000ab3a5822c55fbb +:00a6b0e8a51e12986c2885ed389641ed073178 +:00a6c0f814f9044d5dea422c4b0c9279c3be39 +:00a6d0c593b14871c1de439e3818508cfc9ad0 +:00a6e030ea7d8f247f39cf18d950a0d38b019b +:00a6f0a23470909f32de66076d200e8d0d9fb3 +:00a700dd5d4f7176b8f191de606bfcb409b77d +:00a710272ecd5873955c1c5b256bc2b1b6eb8f +:00a720963fb9e11bbd10b5ec668b918d755028 +:00a730a917501ff293c1ac576464fceff99fed +:00a74051b0fccce5784ccca0b0270a336ecde3 +:00a7503bdb9623f14cc9fb38224a5cf6342d04 +:00a760ab6f51a1c876f5dd1c1fd4bb309467cd +:00a770279a384ee6ae4d83d330017ea126e400 +:00a78077300892ce7a6f2b4945a47316e6c05f +:00a79075d4e90d080308182897a1f4dbfc99b4 +:00a7a0978ee2c11908c1831d5054aa2540d4c5 +:00a7b088d99e526ef86126ffbf4de7781f85e5 +:00a7c0d207e4e3de2464bb3fb33718ad57835f +:00a7d0fabbff5cdc1dfc606da8b012885468e7 +:00a7e055eeed5f7f13f4fca7f0dbed9f69279a +:00a7f00dcb19f1027411955fbd2a13a5155ee5 +:00a8007796d88475ef640e6c4d735f415c0274 +:00a810f029569bb1ac011a12aaf274c7eff911 +:00a82033781a918a601df048e7a3c12471587f +:00a8309950770394c94c41e4eb8db31776c024 +:00a840fb4ed699c50e4642c27797ee7756dc53 +:00a8502a5a1a7e4b10a1873fa3d3b156a34e30 +:00a8603036085c03f8897c47e8dfbc0ef3b42c +:00a870622f3f50bc9b65facb11926917e62c1d +:00a8807b83478495bbbb8e01bba98d1abb93c7 +:00a8904ff4efbf680264fb7d2ec8b13e36764d +:00a8a08b5d70dd14460dcea7f01c0e1900cd97 +:00a8b0659866b363233100bd5de78b4a78f6d3 +:00a8c0ca277c1fa3ac6e53f95cc6d0cf05514f +:00a8d04dc247fcb29a4a8010171a993b108b96 +:00a8e01b775bd093aa01fc6987563e77d766a9 +:00a8f0f986c7941c6c99870639e769730af244 +:00a90012f93c018ccf9f795e7cd30a5c68710b +:00a9100de801e2bfa4b82f73861c38bf2988b9 +:00a920d13eb4d3f92c71f4a7128836528f7499 +:00a930552271bb4fd0cd1db081a31f3809d4e4 +:00a9406837ae2f4bf91cb0b54c9500868baf84 +:00a950b2d25e463aed0abed2db17bb11450395 +:00a9608a897ada80893375c3cf94f3d98d54c3 +:00a970a6499ece52d13e08974b01c359897d68 +:00a9806815b344914541ca983240fa7ee3a705 +:00a99018cc8d69662683938592eb7042a87869 +:00a9a04a003d4c53e979bedf7ff7a28443de3a +:00a9b0cf903d4759df9c5725288937ade3b6e0 +:00a9c0836fdbe307c466c0402fe1e6d014c39d +:00a9d05e798dc0d179b16a12257756dff6ef03 +:00a9e0e5bb21e7a464785604655f0d4c0beded +:00a9f02ea45a4b87e0422f04a1b71a50467d84 +:00aa00a290aa24f7b65b7f61e410d077ffbb43 +:00aa10c3072ccf840df36412a4ed3280c4f5ec +:00aa2097904d2334177b474ad870df98b7fd9b +:00aa30a3ff5fd7c7d190e66788f8af8c95cc38 +:00aa40cbfe1e1ace7960e792cb4bfb1c709258 +:00aa50770a60932248a39641c742d82e64677a +:00aa60a247fc283753a2f30ecd9b826b21cba7 +:00aa702e191453225e3f2c4d87589732868f87 +:00aa806419c77c82ab2f59edb6ba7d9406a6bc +:00aa90007217d8b80ef9b7a8fedafa378da363 +:00aaa048a1e35e180b60b1247edba731e22758 +:00aab0fcedc5c817a654e269de19d9dc423024 +:00aac024204eaf67faf2a290ea8fcc807259e9 +:00aad0c01f21d441dd76e2b1734247aa30bafc +:00aae0d4fb372c30f5c11537f6a98c84c208f3 +:00aaf0316774c5e9be913ccd432375f2721a0b +:00ab007eb2b0ee2e695ff12d31fbea9a5acb9f +:00ab10df8afc4dc4c084569096b24e7bf606ac +:00ab20deb6e6c4ffd7c9144b855414a49230df +:00ab30bd81d46e601eaf2d1ff689ca6811d844 +:00ab40a95a66957cb5bcc64d105743ac7a1d37 +:00ab507b5a77d60411fe5bdfd33676d4b283de +:00ab6040b877bbf441e983cf115d9cf23262e0 +:00ab701ba9e4f0ece8caf20791d00defe0384a +:00ab80a723c795da087c3de2f9342d8d7c6739 +:00ab9049c0a9980f625428efdd9405d41b23f7 +:00aba0a5376d7ad868f0045ac1a8513f13ec84 +:00abb07cdf60d565969168a18b0b9189ae1cc6 +:00abc03906d5cd22fa69a5ac1569b7c7b7284e +:00abd099fd9576bd014b0d8c79bcdf15c32f14 +:00abe0824f239101aff24426fd87c60d12db85 +:00abf019e2e64cc3cb8082423eb97a68046cc0 +:00ac00c83dcfc01182d5e6b8a82c195c2238de +:00ac10e2ed03af5cb329d12fd6914b31518e8e +:00ac20ede4dd25baa61fd0631127baad883c97 +:00ac306c4fef4a560da6c46dd2c0422d055cd6 +:00ac40a7a89281d4202ee0c425c29765cd28bc +:00ac50d56b068dd9f62652801d0206be932d6a +:00ac60afcdd3c7b2c96df513df0d01637932c3 +:00ac70c7d7f7ca7d9ff268b9b97a94d24d0f72 +:00ac801358af31fcbe045607b8552b6f6b9ccd +:00ac9062be4b32544e0679c2de9976fcb86dfd +:00aca022eb641ac1a8d3761c8d40e934d36309 +:00acb035479fc23c782dd8610e7f34ae132191 +:00acc09e7c5dfeccb92c8834eee97f556f8844 +:00acd05c19f9371fd9a705e77b95f70eeefc4b +:00ace03571c6b33125c0d6b0b07d26f78ded98 +:00acf07d32c693e3f886bfb3b42f0256304a6e +:00ad00b55600e1b86752814e9e79c0a0ee12b7 +:00ad107d0615e7f0b9c693a9ea61046eddca65 +:00ad20892eccba66124789e8803d85ea1672f3 +:00ad30334cd2bbbca53a188d31fc25cd293aaa +:00ad40fde9c29ae5a86b813b90505a8aef53e0 +:00ad5077dc2e7d0677ffbf4d271f15d0760517 +:00ad60292cddd9d36b4863c471b57684a78031 +:00ad70ccf96678ae1c92f94e2df3278b3f03b7 +:00ad80df6c966ecd1e0c155c319548781b2c73 +:00ad905e80c660114261f8b70bc0363837e176 +:00ada02b71370b4a8ea358bc65036dce6f24aa +:00adb019bf3d1786f2f72d68d98ed4fcbf13f8 +:00adc06a220fc9104aaccc889ee6a7ef1d8d35 +:00add05111e37e18ffe67eb21d6b2988083d30 +:00ade0f499f8c762f8865a6cc3fa1edabaef72 +:00adf08d76dd4bc4f972cd3da1323d6a281ea6 +:00ae000e24c741c33b5589c363b453391cf904 +:00ae10806a786d9808e9d786cdf054bcca9650 +:00ae203ef43613e02450edd269624e5a300d8d +:00ae3033a58597dd2770f305b22e2a5fda67fa +:00ae40830e07dbbbfee893d4e9e4b81ff42b48 +:00ae50a5d807a61c2d9e49229759f5e5375b70 +:00ae60257ace80b9134ced7128dbffc2163c44 +:00ae70dd35a3835b44770bd898c3749c5a06d2 +:00ae8064092df79dba5caa87da165d6ed8d5fd +:00ae9079ac81903fdf0165edd6c916684322c3 +:00aea014eec16ccde6e2cae0f2fca83cc8e9c4 +:00aeb015127c1e4b36934cc3dc7a3c31e6de8f +:00aec0463c9c80806efe7c6fb3be698745ac2b +:00aed0325d0713193b36343941968e91c200c2 +:00aee0b6fe44443fd58eede4b4b0e3294638c2 +:00aef0df7cd02904c0d2d173abc4ba0933c1b5 +:00af0068d0fb140cee69ea8cc6374bce6a0e94 +:00af10efd8256b5e23e88dfae50fea3c09c631 +:00af2004539808c02f897fe3818621917406bb +:00af307a37acb41f3431d9564c812d6202d83d +:00af406c74265bde168ecdb027e9b5fbfe80e7 +:00af50d2c39b727db2c00e57fe1a31413e056c +:00af606c83c7dabefca1f92436c4eb0b7d6487 +:00af709909258a4950a363b09713504b134137 +:00af801dd79f93f2790db0ffe3e8570114dff6 +:00af90180dca60d0f16362976d6ac337776d61 +:00afa0eccee042c4f7ece25ef6bfc672523ce3 +:00afb059419fa13c7dfe7c55d4447ff1ace452 +:00afc087faebc9e2def25b13196eb63cacfe47 +:00afd0d2cbd60a447c0bfeb335c41e0f471bae +:00afe03c760965ece06a15839e3faa73ea30d5 +:00aff0026163932f6166e2d6465ebf9cf69e52 +:00b000d3352d5fba56ca61c90ecbfe12807e53 +:00b010a26521771ee74981bb099c21a3aea6e4 +:00b0207795f401a87653c4b78bb63b14b8a5ea +:00b0309e5faa564f3cd87098eae7205f035050 +:00b040438573b862898eb7d6d356de314c14e8 +:00b050ace5fb94316e70fe2a2766bcdadceb90 +:00b060e7b2d98dcb036821ab5deb3f647b5a63 +:00b070d8102cfca060355869bdddcb0d17cc34 +:00b08073fbbfc0c74d8368ff37571d13fe2977 +:00b0903fb3f9d17de57f428aa6236176129ab6 +:00b0a0a6e0191e7d71c46f4341db6ab5317db8 +:00b0b0eb43d52814873afa4249035d1c378ccd +:00b0c03857823b2ff84312dd97e0b3a321c35b +:00b0d0092bd51cbfb6d8649e86306b36a3f035 +:00b0e0b25a89a0b4e66a3ccb6297c3127a7008 +:00b0f0bdf1e784d950f49f4236910eb27a0832 +:00b100297c036065180259f671f659bd3ef803 +:00b1106679143313e822ce6646c8b71acba3b7 +:00b12097d1cc7fb23880c6609e2677d5cc8c78 +:00b13074ac9deba287cf388ac5272519fa16c1 +:00b140a1dcb8201d41577a1374f5d11fc649ca +:00b1501b687a40320dd5ae3500a393b905dbd6 +:00b160f789169df1ecdf957fe52dfe4ce0758f +:00b170f1fe5ff704b53d96817d842c4f07534e +:00b1808a46ea3396f12b54baf6fc06eb278cd9 +:00b19067434202c753f63deb0416283731dfea +:00b1a0908b7b29e88401c5c3b69c0939c0f7a8 +:00b1b038e043a50cd24e544098f7828c989162 +:00b1c0597d9c5a3c7ab859395cf364f54addf2 +:00b1d06cd515bf83713075d399c65bdc0d48b7 +:00b1e05aeadba3d1a682f89a4d9f2d737481ca +:00b1f0f70c73831a45ade0604c3330bcde5130 +:00b2005917260f478d32e56e73c87d1848714b +:00b21088ba7784d04d32de151a79720a16f1c8 +:00b22086fe979f4f7de5144d347245dcce56e2 +:00b23025c2c0012d55e15d28f39e4784661910 +:00b240d671eb87721e922fd3463446469085d0 +:00b250b7c2945ea8610ddfcd67c8170c37c2ef +:00b2607f58c855464e0aa5e9005029db135231 +:00b270b47035b1f5ba4f0159cffe40bd0a4252 +:00b280badb083cefa8232c6660b6e4a58e4918 +:00b2900107f0172adbbfd7444e59083464f0bf +:00b2a07693804a23af90ee69a47f12630f163d +:00b2b098c4f36985e7b0d67a958274d9dd28e6 +:00b2c0eb5a24c6d27b42009e24481fb2758a39 +:00b2d0ee57d9f2676943a69dc14fb73004a22c +:00b2e0f2bc1c5f3fd78fd347b2e3aeca916a58 +:00b2f097e0c788348a111c53dd159b0d3741e5 +:00b300949b08291e1d9b058815c9979f2d25dc +:00b3102ba4e25a724da75dff982d6f7b1adaed +:00b3209f7f86a015e50ba316cce6dfe98f006c +:00b3303bac8eaf3157f7fe0f6bcd574c213825 +:00b34080f508dc201421622e975d05dc847ec1 +:00b3509ca5d74992df8cf4f6d7db640e17ccf5 +:00b3605988a71612eb4a711bcaa157a31f4324 +:00b370c730c87c3c693408c1a950a921d410bf +:00b38068e2eebc46bff3fa7644aed565aee62f +:00b39084597e9c383972275c49dd8b89eb9d4c +:00b3a0a705bb498798fedfdfa011b39be2e8d1 +:00b3b0397ef1334fdf3dfebec450be5f2a7952 +:00b3c0a12d7a16a5a2713c23f39270f2d3b17b +:00b3d025ca51c2ac6397181800566141def104 +:00b3e07357922f06b2de126168b245cbed79da +:00b3f0ab5390d118118333173f947d0eab0aa2 +:00b400ae8fcef8663760b01118b1ae5e893edd +:00b41021efef131544b54f3d381638b616b228 +:00b420feac96fd4c5ea054c930eee097000430 +:00b430b1e7128d8c95aec6dd193a1cf9cae41f +:00b4405c4fada94bd5b787d6a094d8649b34ca +:00b4500cabefeb00ab6fd3d0de124bd475d530 +:00b4604ab8de63f851928b0d7e157b996a8b36 +:00b4703f7fa23878b04319851442e62ea6adb9 +:00b480edace19346c6841e110b0bb0232d9137 +:00b490664c1f69ae446fc2b99dae0136d67032 +:00b4a0567387f8731a4fcebd506c3e6b026e59 +:00b4b0ec25c1c4124f46bedbcc56f7deea619f +:00b4c03430eab4dfe7f75405df76323c3c8d11 +:00b4d0bbc0b0417e4b64c223af803f7e28e9b1 +:00b4e0d1f3869e928b94652363c809e35c8133 +:00b4f0518d83f195798a690a6ce3bebebb8057 +:00b5006573a9567d6561ad3a7697195d7c4906 +:00b51085089c1839ca4325c7507c8ad0ab87ca +:00b5200dfed3e58d0b5d22a65702ae59751711 +:00b530625853ea46252b2297ac8d64c28ad668 +:00b540862660a98283ec8cb7c2328ef39b7ade +:00b550bc3fb99dfd661a98a406bcb66dc313bd +:00b560c86fed0135948c1e9342ce509ed7e450 +:00b57010193e68c9ae1c26606e3e60b557d3f4 +:00b5802311c3050a185709365fd83030e266f1 +:00b5903141a4e8fc93dbf574757b72a56d75fa +:00b5a080cf79d74f45ab2ccdb5670a13cd544e +:00b5b0f25bcd0c58e32345cc8e7259c2f1c74d +:00b5c0cf5c07a97c5f90b7f77ad40f9f97846e +:00b5d02d62b298bcf28c3511434a8ad5afcdb5 +:00b5e0b841aeeffd2cf4215c9feba94690bb80 +:00b5f005b62e7737fcaa93a91b50a6cd09879b +:00b600cefc88d17180037551c0ae24c77297b9 +:00b610f7d60b7fbfca20914acc62feb55dfdd8 +:00b620ada268e0ccbd6791afe11e09315a1047 +:00b6303d8fcab83d0908261c0738c585bacf51 +:00b6403f9e45d9173933134311208b7da56d41 +:00b6505a52be69ba938e5cfc978743ec3f4a2d +:00b6600ce487fd4e8ab9963108861c4e44231e +:00b670ae09a35855feac0da39581af69a3e2bf +:00b680ee61cb0789c4d7e37f00051b6a6a83d7 +:00b6903a4461b2a2f4839111fd9d6b57b8e474 +:00b6a0a1c9605a71c42e4a676a8a066f01c8dd +:00b6b0101372c8d8b42d184b4cf39f62d73684 +:00b6c010527ecee14c4a1ff05e1f87a94c02d3 +:00b6d0208fa1e3efe312f9eea0b4015146ddcb +:00b6e0ed9ace5d49e1e8ee38494fa8a7b32b67 +:00b6f05db0bb1c8040c5c791058d747ac38399 +:00b70052de1d56d8fa3dc8fcded42844439f06 +:00b7102d15b0fdbb9464020d1cd642f88fd466 +:00b720f8082f7c3be3373683cbd0d080cb6e52 +:00b730afdfd3ceaa323a179fb88c4ff4a91c8c +:00b74064a497103662af6d07dc90d43e72be97 +:00b7503e779aeb6b1878dc7c8a05eb3bf31452 +:00b76051272246be21340c4596ba7156d2753b +:00b77048023a154fd7a5b3ad9ea07af00a60aa +:00b78088405dc84e3f651a1ea8f182fe76b058 +:00b7900b930f0d3f513f47cfa1245c8cda973a +:00b7a0b8285ae35d81d526f5a869ad2c038ecd +:00b7b04c7352eb9e8fbf1f01eac100e51cb5db +:00b7c0d9f1c347804f21a279edb24c4d68e257 +:00b7d0fa5a9e90603b6a72b0461c7c8f357920 +:00b7e044fa7add17c6b94fd8dece977bedaa96 +:00b7f0a3eb0595bab6b2f81347f1bc7a06461c +:00b80037d07bdfb6403ade8655a9d3e33eaa8d +:00b81083c4d9a7e93e42247ad441e07589dfe2 +:00b8204ff5ba9c847844b288eefc97b35dfe9d +:00b830ec736192b009a74a5554befddb8542d5 +:00b840b930361cdf220ac9e19e937a6a4eb9be +:00b8504a9d52496ce84c0d268f6fbcdd8e7171 +:00b860d1802caf9bd18f80d0c7c679a78830e9 +:00b870e3a45a420b494f59e193f5898d8a2932 +:00b880d51e8d3fff31e07df6752bbd03793455 +:00b890edb380adff9c1a27a089cdcd4667283f +:00b8a0369555e67f09efc20f52ae1f4d886020 +:00b8b0ed7e29f2585081bcd15c68b82cea32f6 +:00b8c0f2da6cb9bdae378f2ef858ea21a89c14 +:00b8d0c1a85de31004ec99d94c4dca4f6644e7 +:00b8e09866b344cc6b72a402637d83ea03a22a +:00b8f0bd7193b60a6822524c5b8e8d87c413a0 +:00b900e0f8d43460a352f4ac17e7c8b8211453 +:00b9106ee6c9eeee703f5f4d85ef026ca2d8a4 +:00b920c4f928c4a1bcefae9b6508b26e193aa7 +:00b9304748ed9ccd599dc60f1f932ac1abd7bb +:00b940beed1a6386c60f735f0e5dac0475434c +:00b9500cbe3c021823fb51f5f982c5af99a097 +:00b9605908556fedf39951ceab8c69fb3f3c9a +:00b970df659033a906d46bfdb45a191c961834 +:00b9809ef347d7b38952218823c10c2b1b78c7 +:00b99068cb3996ddd173e1681bd9fb4c31a40f +:00b9a0e421c3c7ff145df2d155dceda0483086 +:00b9b06fae85c0228674041d6acdd502c1b06a +:00b9c04c844cf303853e86ff31cc8bacd0ea75 +:00b9d0e055eecff1e4fad43b7738af3a3efb8b +:00b9e0562f43d13607cd4bd901b391e2ed45c6 +:00b9f07e9a09e8e21e3f883e133144a4339b56 +:00ba009f8e483578a1f44f95d2a6f9a4676aa5 +:00ba10834c19c472897ba57be19358c1d62d6c +:00ba20c5b2d2cf417f52549b2f183ce94e88a8 +:00ba302d7244945b3eee653009001c36ac30e5 +:00ba40946170a895e62241f82038c19376480f +:00ba50c1eb6a2992495cb563cfd7955829da31 +:00ba6002ce38cb51e066aded55e16bd327184d +:00ba70793a521a498d338f6e4e4bd6f60ac2ef +:00ba806dfd25e47ce5d7d5ef5cfbda1057a003 +:00ba904ba14a4e8205e37c8db71279941ce905 +:00baa0c4f22dcc8dd6490754b4d53b6efbbe3b +:00bab0b3585edfc999e4f41c57003bb748ca29 +:00bac08581acb35351ee42815e2546c6c6b764 +:00bad06f65953dfe058169563bada7ae8f4019 +:00bae0576295a78fcef271df63219608a0d4f7 +:00baf0c40ea4ad8280680da6038e2c2df4faf3 +:00bb00602483c43278670441ba1adafd55bfb2 +:00bb1047961ad86532a5084c76b2e1775f0b31 +:00bb20be3d494290da99eb0a01dd0887242923 +:00bb3027340e3f22c0ac878412c27aa59e71b7 +:00bb40a3d6d7b62ea873de8ebd3abf5df6d080 +:00bb50bb2486570ecddf7bd48f18c775a8456b +:00bb608a2b530e722fe0f28201ec25f5fd7974 +:00bb7079f9bd7b36a738c3c04d61beac5f7a67 +:00bb80735084900f64696664f32b0a90df6e74 +:00bb90dccecbdefb2f9878cc9838227789d679 +:00bba05272bfcb90101f01485450ecdec4a9bf +:00bbb0751dc33a55b5afca7b175e73cb15148b +:00bbc09e1a06b1f1966ac6ccffe81a010a95c0 +:00bbd0b63a779e191a0524974434a62e0648c0 +:00bbe071a36c279e29d219511b3c855925d016 +:00bbf09e978cbf4fd7521ef26c9a20a4df92b6 +:00bc003fce0a0dcdbb09898eae3dc37c21ad38 +:00bc10b81934c14a689ef2d3d0cf5b2ca8a8ff +:00bc200dd79e3e18e0952bc1e48e8c9a8becff +:00bc30f3e77fbc3b1dee39f3ac51e21fb70aad +:00bc407d625ce24a5ed3978147c3b51dd63979 +:00bc50e734e8a412e0c2a2d5e449798d2ea326 +:00bc602d02db44fa9a59044e998c686a9f8bbd +:00bc70498792034207dcf4057aa6390b5cf4bb +:00bc800b8f3d094e2796d923e9e8b740dae6d5 +:00bc90bbdca8ab7973f52cdd3aea4c2662e975 +:00bca04ebd5be39b813d38c85b14cb875582e4 +:00bcb03e588e59aa8d10f25a99e99bc9b9f04c +:00bcc00bc1fc1de4a0476880f9672e501d3384 +:00bcd056128b000f5c719e210189d205d65b6d +:00bce066f6de3008dbf58915002628cf8ec328 +:00bcf039d23666cbc5ad46c2b69ef26f7ad2ef +:00bd0021d2d33b66c06a936ee9dc06612b698a +:00bd106142d8c598fe4b5b0cc8c7511e8dab2d +:00bd2051b6bc77e13e5ac96caae72d55834c13 +:00bd30a1a943b4170a15c6736600680a6f87fe +:00bd40f3d80bd6b28822344e4fcf68ab36e297 +:00bd50189d01922d094b8c5ee5609fb617bcd2 +:00bd60df9cab0e2a404b7bb9b1c28beaa1ce65 +:00bd70fe912b7db3a0d178ee219cc766af4b54 +:00bd80cd616762e0870c4f6f1dfe0385efe245 +:00bd90985bf91cdcc8f8759f6ecb24471d35ca +:00bda02a9d012e10fb3f120b4a8b1ddc00efb6 +:00bdb0123675992ba970d2b552cd66d1d307d9 +:00bdc05ce43afafe56f152f4efe4a27c551bfd +:00bdd0d4ad152243558d8ee0ae406b8d409d69 +:00bde04b5f508e66030664e9d6e701e0e7e556 +:00bdf0d732d4af23bcbf31eda3bd482287a488 +:00be00ef6fd21343e52a1b5fa85bb7a375f85c +:00be105b369f6b7fe6467c4701a0162b74ebc0 +:00be20bb50664e1b33c15febcc7b0f5bbb0af6 +:00be30f1f3e837a26b9441f44522a7ffa7e819 +:00be40946a975541717516254fb54a9955cf59 +:00be500bdfc20bad698953b34f78a1b8efa844 +:00be607965f74f3ef5abbfe49383489465dae8 +:00be70cf5eee23ab8fd010e3d6ddd147323a24 +:00be80c7a18b7b2ec8951c98207f88ad4e82ba +:00be9022e3372d2d990425452af8a4aecbce02 +:00bea0a626cd098f7611cbf0e4c70a86f0c318 +:00beb03269950c5a0f2709f587e689f3d997bd +:00bec0da5e518022f0ea790a0fde570b24c19d +:00bed09a252e2f16b6ff4b6681127d2764ca16 +:00bee035cee9e364d010d4156a2be0bef8edd5 +:00bef01b7166e622b951317d4f4adb2225dd87 +:00bf006901c19de046c5d82fc1e778992a0e0b +:00bf10f243e26739e18c7fcd74de0dfa6bd057 +:00bf20a0cf90c7254f5a74d124cf3f69e6b763 +:00bf30ab56c8f14e2d8a1a8232021b2d319b2b +:00bf408a479026b91a0f1149fa4fed3fed0556 +:00bf5009bc8d4b7cc265298b5c91c8bf3b6de1 +:00bf6092cf921c396bdeceedcadf43df4dbc97 +:00bf7069c03ea3be93a0dbe777858f0cdfa5eb +:00bf80764c0b7f54552cb4205a9a2154c4f8da +:00bf90c1977fb71a1bce1ae620f399f5168e6a +:00bfa063ee445a210d8a2847e9d2b9c8184a93 +:00bfb08eac5506ef5e9b97dfb55e5fe747cdb7 +:00bfc0c3e6794e887922b54942946414d20acd +:00bfd0282f312745cf2dc865ed91b0a6724a4e +:00bfe0a23804e1e0142d989778230a52a68ad3 +:00bff0f4c76a3c85b771d51dc1d0010b8ec9f9 +:00c000378c4a0ecf65eca17ab6222ab8c73b25 +:00c01001c4896157b4f20104fc0b5a97880f4b +:00c0202da5dc2f8d82a8bdebf46ccc5fc8dc4d +:00c030724412e5955b2e423bae0b8f7d364155 +:00c040fd608fe58648bb46d2cd46de55ae4e4f +:00c0503c0329b8154cb6584de8926729097843 +:00c0609c27a9abe67b2f3ef555b8b2e0c8daec +:00c07001331525fa026f0687126ba5105a8938 +:00c080889d114bf7d04f95477483ff5b7a87fb +:00c090fb1e19e3ae534b7077c310c47d8eab88 +:00c0a0b6f3b13b0f38fcc9d234b41b02fd47c5 +:00c0b0fc9ab355132b0ea79507e44acbe41be5 +:00c0c04e911d6c72f487ef94deb2e6c741448d +:00c0d09ee926cb5acdeba48941b1c106ba7202 +:00c0e059680beb8aead9a045ec9919d9dd119e +:00c0f076ab2b2aa267443ec1db3e7f65e414cc +:00c100b1910b9bd13a0d47652b525cc16947eb +:00c110a24effef8f48709a9c05c501b2ff244b +:00c1207a9fcfd66de422e4a1ed14d7e6fccec9 +:00c130e76b6e78b2ecf495aea36a82b2c0cafd +:00c1407457029f70562311b31d0e48b6805df8 +:00c150bfbff88fe5592f52619e76beb09a4376 +:00c1609eb334188bb344d680f432d5edd53f67 +:00c170762889cd2d3ab4236fa6cc3c09106d27 +:00c18068d9b9d0b5288c7c0d5baea5b1a7ae54 +:00c19049e8384d2ab332d4ced70aa17a602d29 +:00c1a08e8258956689a856200c1585347bc6b9 +:00c1b0affde2db62a207af7b9364089afefffe +:00c1c0ae604e6bdbc1430186aaaeca20c34db6 +:00c1d0040b27a4eef39f20e022be72cc0a7d21 +:00c1e0ee28e582687900a261335bd7d6ec101e +:00c1f0c59b757c35e54c97aeb3de440153732e +:00c200c379c33bb2f925522dc7f76c46c5a31a +:00c2101d8cc5aca2324edb0ebbe2aa079d47f6 +:00c220977f23e2fe6406979be0ea8f4d63929d +:00c230152c4c04fa6714d159387371ee4d782d +:00c2404d7a0a3c19a54e615d58f15d391b69fd +:00c250c9f583516ffe9fc17024ded450350e74 +:00c260e294695051cc2aa4cb4527616f7fddeb +:00c27073f671361abd91137bfb355877cccac6 +:00c2804543969f8f0367711cebbae6461ac500 +:00c2908363ca206364cbb17598da37b6f06155 +:00c2a0ecd977cb064e088038d24997659ef03b +:00c2b04fbca76a514493e75ccc02644ec05394 +:00c2c06c69c835dc0cbb3333ef34b690c71a0b +:00c2d0b81f1ec773af664c852ac5dbb2757bac +:00c2e00e4023624b0f9290eb676cd6234cc296 +:00c2f003d40640950723f00a276fb912f44aa3 +:00c300dd23820bfe73c143f9ae3abbf82e1995 +:00c310232489776d6174ebd32e09867684e791 +:00c320e3349f55257b90a6954d1bd527224fd6 +:00c330ee35b1c947ce06931e7b6a8ea3d4f36f +:00c340a6145453b12a77c44235951cbdb98c88 +:00c35008fd6259b22e382c99c2c2bf9148026e +:00c360a548662f2e18b1011b59bc2f1a295180 +:00c370e9b8984cfbf3dbd90ba06708545e73e4 +:00c380236c87ab50a0f05939ff7e23f9275149 +:00c3906218f61b2d83cac802f12a89a491aa78 +:00c3a047aa8be9608949569b42c5a50db5f11e +:00c3b0d6b0bb3a25a31e8e015582ff35436753 +:00c3c07f0e6bc0dc1230b137aff14bc03ff96a +:00c3d048c32b070ac4dfea5332c861559c7aed +:00c3e0c30001b56d7b864bedc1f40cb1e69330 +:00c3f026528245952f0c49642b3458f58b3f43 +:00c4008a673c79489b5c3f46967f9a9d572fb2 +:00c4103fcdfa558227aeecc8c14fe3c80ddcde +:00c420721eaefb31b1e76e8c03e61d1a1b6bcf +:00c4308e74911b8b5ecde696ed02dcee0549f4 +:00c4408138379b20403054ed51d0794f3996f6 +:00c4503c4baaa729cf30384b24e2b83dbb50bd +:00c4608b3f16311b4f54e43e086bf938237474 +:00c4702967def233cb7972503df0f9d5052e16 +:00c480ab3e3114cd3bb6e0ca0434ce015faba0 +:00c49029bb2f97a43990a1b22a87c4eae1d168 +:00c4a0a3cc143db6843b4bf4e1998a7cc1b137 +:00c4b0e7e460bd2fceb14fc9bc68b09e72e272 +:00c4c0ce796163b0d9c879a90be883eafa2c12 +:00c4d0d5b0d2e4cf047a7064be63cbe967a791 +:00c4e0f4209e147798e9ec2363843a87170af6 +:00c4f08fc87d03afec24665286f16f2a5aa75f +:00c5002652e73ea8892c64d360a59479fec3dd +:00c510a29dc050c4fbbfe470e08256c3cdbe22 +:00c52001906722f9e3872ff7785e5d6df89595 +:00c530868d3007e251bd720e22a62e33284d6d +:00c54083a4e9b081b79c0e52e6ad55a6843a72 +:00c550a47aacd836fc37542b73bf449e706b37 +:00c5606e4aa79fd69ef57037eabf093d491ebd +:00c570411c14dc5ded592d1582cafe1462a342 +:00c58026b113c7cf56cbfed2ac1530490b8d50 +:00c59030d62b7ff9d76563a34b0e62710abb2b +:00c5a067eabe9c438fb5340db80f9ad91f0455 +:00c5b0b26aa20c12b63113785409feadce3838 +:00c5c04e0c9b4168b7d21ed8c43da84bb7a82e +:00c5d05eb146a29d7f102909b72d068058f1b2 +:00c5e0a93f214e8ee952af2aef0675d063c436 +:00c5f0af1664e8d60cb8bdadd32327185b8195 +:00c6004297188ced3b61229fbf349812d47511 +:00c61041d5759df43a9a2869d92f9b5980119f +:00c620ef654c39facb1bbe42024144b1abebbe +:00c63096f0116fb62dd2baf05bc0ff63f66962 +:00c640637f318ac16693e34c05544414e5792d +:00c650f5ba0344192dce5c266b5e8520916a57 +:00c660e32b5fe505964c22d3fbd959fda66d99 +:00c67051123ae24b592a69904deb0cf2c5d0ae +:00c68078e3ab36a611bac913711c300c49ecf1 +:00c690c4db77acd5f0d4a2816000eb8c65ceae +:00c6a03efc20c1d0b3cc824935e70710d79b64 +:00c6b0bc6b3420a856f79484ceee19ff41d0fb +:00c6c06d4bac1718fd8898e1714d7bcfe3bebe +:00c6d0ec9e4ba64900810191810f18b8246879 +:00c6e0fa025e58873ceab9af20f1f581904a82 +:00c6f0ce89f9292e85285f11b0db3aa093b4c0 +:00c700d269729175f7e7801149248a6d5a873d +:00c710fc4877e931c875793ab63d69b6436720 +:00c720a0297a9545d44fbb9a8e19d6437f9560 +:00c730895b6ff77e10f1fc7c184039c0eac465 +:00c74082dd713428e3ffcf67cd9b32866043fc +:00c7501a5088a01b84663b6c6a35bd15925b65 +:00c7602c34851060e83f80983530852e98bf1e +:00c770cefe095913235cef527cc14f97d0c8e1 +:00c780bf692258e2d7df154a913b972e87fe5d +:00c790faf0757a4cf0301b28f94d4e6e1821ae +:00c7a023b4c9aebf1112bfc72f688d682cc992 +:00c7b0b578fc586c8b501fe31aeb9f1f723cf2 +:00c7c03252ef7049331b65c60b06d713bae434 +:00c7d02248c8d12f36fc9fe7d2c5b226609754 +:00c7e0c946b6af8330cbc0827bfe055506ab72 +:00c7f04d3da9f3067f2c8ad851d49a9e5a1b27 +:00c80014fabb2c7b6c6b49957a1fb954814f33 +:00c8104cfd0de02895fda4b03d7faeafb8722e +:00c8202d052ad601317cf47139144766c75df0 +:00c830f6d0a11eb7b79f14d48ad04a02434165 +:00c840d17d5f3b5afaac46cd3ed18f5df62e68 +:00c8507c57c34c64f55bf83528a8e0b8b63bea +:00c86040a3a9d1a61706c2ed34543743594b8e +:00c870afba4287664fb11c659c8af79db93885 +:00c880987bf5b61718ac35cdc6493e5c2321e2 +:00c890dedbe67a679ccc59ffb3f89984043648 +:00c8a0a8dc1bfe68211686801f3f41fea57628 +:00c8b0e3141547f2d878b97b26e57cc73b4e73 +:00c8c05330b1495119258ca5aa1d421b3c993a +:00c8d061421f0d90e50f9842ab7f51dbfaf892 +:00c8e0d6bf2f89688885f24555e5c9ae7ad5fa +:00c8f03cfabed62f42e8d727a2d968f0c1a457 +:00c9006aed069dd23a539bb2701c4b235701c2 +:00c910bd584ef5e711fc3f50f5a09eca16daef +:00c920264a58f8d76c538a18982c3b17144941 +:00c930787a8303a714f1c875b92442b80fecf9 +:00c940b1046d2345329fc9ea59c495d529a200 +:00c950a2147b71d990d27a4931e1ea33ff739c +:00c960b7506025a002511e41772145f261185e +:00c970264f12615834abe6049b6c77ef17afbe +:00c9809e019d70e78c5d2c83c2dc2af1b3373a +:00c9909aa2e4ac3e4770750e2c99d014dd1a08 +:00c9a08a8f7b650ef323771ea6c8063bdc057a +:00c9b07fbda040b2fc9f92f9779116bdc7cd0d +:00c9c00e38a7f5d613725d44e4700f5f881a88 +:00c9d0378e5f9811ba2db9ef86fd6a8689a152 +:00c9e0afb53db3eb431a1961c4f2772b994765 +:00c9f08ac68b6c19357965b62172e42a4255a0 +:00ca000aafa71abc268789e2d2c8cb3bfb9537 +:00ca1024b701fd2f3f291ae9617c003638bc27 +:00ca200080a0a1ce0f36b84b55ee61fa251bdc +:00ca301b7e579ccfec356dc2cb6987fd1509f7 +:00ca40b79adeac9341456d3ef77f86e023dae2 +:00ca5061700ae3746b2d122a10fd3942327505 +:00ca60ed593f589d13f4e5fdd2ccc2c47fbccb +:00ca70e989a45d56cca555090442fdf73b9098 +:00ca8092743b0af418231294aa23f11396e3b9 +:00ca90007b35f0a71d8de7a20ba49c19f9901e +:00caa0958c8a6f7f1747e8a466c519f8315d06 +:00cab03eca6ea0ef353bc9682b15475cdcb5a7 +:00cac030da2081a78a4345abb0072e7ff68083 +:00cad05301232a8c9f1894062b77f362a72ee8 +:00cae05b6e2714fcbdb36e75c5715e6125d306 +:00caf09dc475648a2676ebc212d0439837635a +:00cb0047a21ab73edd24c27208e8e03b6749b7 +:00cb1021dadf9784fbc6316c320851cdbde168 +:00cb20d6837c5a452a6fb11b60921427d53a94 +:00cb309fc3a0fb6fe6689add68ec3ad44d609e +:00cb400973d8fc3c6a85e13e2ae3b7db81f81d +:00cb50a538d5de527371465157ba3d130f26dc +:00cb60484f5a8f38b83b55f6f196520fc1c2b0 +:00cb709bf7a801b4d984bbe19e9b326463d27b +:00cb80845cfe04506970c53e4e5e19412df4eb +:00cb90cfea677916455efa717090dd808256cd +:00cba0f3ad3aa42376abeb8d81d7a29056a29d +:00cbb07a42c867b6e9cd9ccaad78645f532846 +:00cbc0a637a663359c68954b9cd677d1ba50e6 +:00cbd0fe140526862e07c07ffdf7d5f26b8fb9 +:00cbe0b20a9ccae7b982fdc1f569b3afd2272f +:00cbf043551cd1a24ffb846cdf1ec9fd8d7e95 +:00cc008740b8368541bc9d2ff0e2b3ed25e8cb +:00cc10fef79305de16a6137ef6de56657217cf +:00cc20073f3bdba4c43569abf0734be884675d +:00cc3031c9a9dc8dc61d57568b753b7218972e +:00cc40a55916bd81a0590e7288428432fa2f77 +:00cc50d9ac348e723d1699f4e55f11b322880e +:00cc60195984532249b9f1f7da24361bb047ca +:00cc709892c260bfe312565e87ca1f0b946182 +:00cc80c5550e7b8bab82cdb8e18560170c51eb +:00cc907ef1bd060e30a9faa9f78cebec733b4c +:00cca067bba0e7f6fdd0b2da78fe97c4c9613f +:00ccb06818537fff0143bf14054d73168ae83f +:00ccc0a1c4a370ea8bb54373024275df277b2b +:00ccd0bed89e255e79b30e78af3981c2737674 +:00cce0d5f11901fef8551fbe0761f278390029 +:00ccf0c492835bda091bc9f1c403ec81c63802 +:00cd0032740d4bf40713e8f14ad31127ed4caf +:00cd103f14bd1b8d9553643502591bbb793c4c +:00cd206a97bc6b741ffde0b40a53efe76f3357 +:00cd300b48b7f9eae7d3a3aa4965353caed486 +:00cd4090d150bd950b3ee1d7fa3aec37d5a678 +:00cd505a7a03824eef1c20b7f7a3dc02f5044a +:00cd6076b349f92fc8c47b35df54117a66e839 +:00cd70f17e9e3456a915883d70113349457750 +:00cd80bd2cb721ff6a9d7adfbfb5e1347a7927 +:00cd9086be33f7f1bd6cc45773a0f341f1e2be +:00cda0fce6b6d6f3f1c72cc774ab8b9875ac8b +:00cdb0e062e3856bd83d75fc23e17c4137d21f +:00cdc0d008cbb6976a330245b295313ca76b24 +:00cdd07865b6de257d09d42d70d29ac4d09be5 +:00cde0409e1b0626addfa6bb42bfff353cbb37 +:00cdf09ea0f18c7ac2c87d5dbbc6e24a8ceb98 +:00ce0054766efae52fe4d7558d4839272dc56a +:00ce1032ab82e5ef70e94223fa399af59d739e +:00ce20aea8e62cb6036b6454bbf0b5714f837c +:00ce3030fcb4ba67528319f72c5816db107628 +:00ce4076f1dffbb0d84a6e75f7fdad32ad91b8 +:00ce505fbb394fc49266de7304c1bff67b70a9 +:00ce60b7e1c260cb235b1d1eaf7ecf7affe7a0 +:00ce70771015c563ec2b3d7f428a7f4b5e9835 +:00ce80a9d5dbf585877657079db5ccf4e8f938 +:00ce90514f2fac034ec21e4e36b53515ed0d21 +:00cea06b4550671ea47cc275508e5533890ee5 +:00ceb0dc472179700715f80dade6ed910d1d13 +:00cec02a8fa2c6f85ab95c9528e8b5f8f4beba +:00ced02830f365185dd2a232279472ba51865a +:00cee03c74e01e4036a9d7705169f7d4cb7697 +:00cef04c3cab505ad211ef88a0edf93b155e64 +:00cf0080c01e8a43e57cbdd22012b75d2e61a4 +:00cf109db6bf7071c2db57ad8bc0f26f2f40bc +:00cf20d7a5ab7bd8f025aabf16137e2cda9af5 +:00cf30810290c11a0d7c95ed8a6b164f8e2391 +:00cf406f72b7f650b0a196acf5bf0798145048 +:00cf5019710278530718cb3ef25113fc05b52e +:00cf605084c72a940ff31daf2fa2f1deade4b0 +:00cf7031aee7c2a66b99d57dc186517844a1d6 +:00cf80d70a3a2be6b927040dba9f09b6290ff7 +:00cf9093fe5f581029d0876cb2a4c77406f560 +:00cfa07bd0de2b2173849c883ad57e52ac0e8d +:00cfb009fde77ec757d937bd795569fdee367c +:00cfc081d3bd34d901068c460d3a1fb3f246b6 +:00cfd01f7abd9824e17ef9eeeca6ab79cda25e +:00cfe09a5ca1d2e71c995e5e7790bd4455832b +:00cff0fa093678bb0bb550788977bdef31ac1e +:00d000ec15f5577da3513c889feab0a1579c15 +:00d010da79e87342d4d5bcf1a125a7c6e1721d +:00d0208a8ca454051484bda3fd9e19eb871919 +:00d030a9feab9deca4489700b95ff3b1d8217d +:00d04039f420612fdaca60694b7d19e16163cb +:00d050bb28ed0536ca53ae7f672e12f91065f2 +:00d0603c958d52b2475f54af1e33f38315990b +:00d070f8451cac0d45888d87729b74f2123aed +:00d08043ea75a65a4c61069bc6d67c2305c702 +:00d090290757b62071e56b502f9df67b42f84b +:00d0a01fef969e302e9691dbbd89bbfaefdf1e +:00d0b080f6aca1aac9c8e0293b70f3f395ea26 +:00d0c0cc9a77ee6642b0b5cb23e31eefe477a1 +:00d0d04c1f5ff99ca5e060be9923f7249cc1d7 +:00d0e0272fd3004aee5d1565b474656cf93f62 +:00d0f07624df929239024ab716f19ccbad2280 +:00d1009592e0d9f53aad8da19f75afa10fdfe8 +:00d1100d5062425a8cfc34865deabe8919b7fa +:00d1206cbbefc346ad2c6287b6200ff60ea754 +:00d130b820e8766c9690b9a2bf06f683ff12d2 +:00d140ed3a06a7fa072abfdffe70e909e92e95 +:00d150158b802dcffc125ba21ac48cf22dd21a +:00d160be2bea5379d11bf8ce23156dc5050e54 +:00d1709595000ba487cc351eadee0e00689a56 +:00d180de0d0df5341d50c7dadcca04a5b90a85 +:00d19047d0c2b185644ce97d656e93bff7ddca +:00d1a05918976ab17fdc5b2d55368520a1a7ff +:00d1b049662e0933bd2cc48198408030edafe9 +:00d1c078a55cf6c090b5e8c8f7cf90ac96d711 +:00d1d0522ad82f981a8b9f1140bf5e19a8f57a +:00d1e05c0520d0f8aa1e7f03bbd3d81ce6f787 +:00d1f076e28271b1380da0f12bc7dfbd48caa5 +:00d200483d199a143d7e55c2591098d37f5060 +:00d21019ff83f183485156e3ddc4dd68b9c365 +:00d2203bcc8c6b37721206ab20abb9585c410b +:00d230683a6d08272219880b215a26310f4839 +:00d2400f489a65f816bfea49ee062f7c30d47e +:00d2508d5a908f14c625f4db04d4a19fcdd668 +:00d260b981a3add460d4480c5388e9489607a6 +:00d2708fe8af7a379fda10ad805e9bf22a1eae +:00d28018ea09b2274ad2d05831c72b1a2aa61d +:00d2907cde58d464939bea094fc55cbfe3842d +:00d2a05d025fabe8a4e86b61476150641d13d0 +:00d2b099a9243a671a4869fcd231212c2322a5 +:00d2c0cafa3cac05b034a2d2e6b6c7b2e7d76c +:00d2d006d38a52eff8eb17cf007a0c2323d90e +:00d2e0fcad307dcea4e908f6e80a9ec41afc84 +:00d2f03e412b9796ed3fc6b3862e3eb8f995d0 +:00d300a6de164ba03f293fde60ac65b693c039 +:00d310b05a9dfa0ceedc393655ab14daf21cbc +:00d320fe3bc1513a396b20d87724d75facddaf +:00d330062a9fca944e9d01a85eead63c24882f +:00d34070e52e7201183e9ccd7624ed43ebbe14 +:00d350112c7c21d27bbc5422598f2f43b0f3bc +:00d360550fe9beee0dd67898ec914c251ba8ad +:00d37082e2f504605f6b2543b04f25020d8627 +:00d38020c2db0bc6686360248c369e1bd9eca4 +:00d3900b271432eb0dfb767d16aec8256af875 +:00d3a096c816c75b88ecff32756659fe7e8589 +:00d3b0e3a9f758b8107bdad22de5af2e393c74 +:00d3c085f98be4f991135f49ad6984b28b0c58 +:00d3d003b0fc936d862ac6ab010285705f545b +:00d3e0dda5f13e19e3c3db4acc68f367da48f2 +:00d3f0cf8f3f0eff141875ba3d77b3d151d3c1 +:00d400815c9f4f91789c42f87067f14ed319bc +:00d41021bc0dcf101f6abf38e3d3876819aa7b +:00d4202405175752fc21aee42cce5f5cbd6296 +:00d430fda850625da1422d45386aacc9c3ce80 +:00d4400af8522242b67b038b927d79d085b61a +:00d450ff00ab1edc56d99d49f7e7f45d496aad +:00d460d7588b63580c773b011c561a7704047d +:00d4701b767265674df34fc5f51a5f1483e1e0 +:00d480a9bb4d7a98f1a593563d87978f764d52 +:00d490599a6a8c6f526bf2b4f62c49ec6f69c4 +:00d4a0f85999b7eab05f73cc16b7b1f5f1edcf +:00d4b0087e03348e4bd8456975cfaf180e1b9d +:00d4c087644d9bd6cd167541ca5d76c05c4352 +:00d4d02427dfb477108c8e5d96652798d43c02 +:00d4e014993b8373577b3debf199d3343b170e +:00d4f09a007407006c2812f7819561198551c6 +:00d500cb359508a05689b10df2434007596afc +:00d510fc41314b3480a4923b4e14d24eb630f2 +:00d5209840d1942c3e315aea2966d0a2dc457c +:00d530d7d021cb6270d8c33af33705433b0ec1 +:00d540c7a4b6cc060c44c971702398badd2c74 +:00d55084549e996bf98b07b0c0431f8dce7740 +:00d5606ecf520460029ffb00818eaf2da6603e +:00d57077e9bdc259acf1985a22d21ed7022cd1 +:00d580caa122b9f07dfb7e3509fc670639c915 +:00d590d35d7262848deca04b56884861de3cb1 +:00d5a05ff6dc74192f84f707977990f4072b8a +:00d5b082939a2efd85275af488b5f1f6706370 +:00d5c0990a06b5ad98ce860138335841fc0b50 +:00d5d0b776d96ea0fff118b75027db05f1ee51 +:00d5e069fe40768dbada84c79b064fa6f3aa9f +:00d5f013f778a166e01d93e058b303b5bd1fb0 +:00d60063b80d1e6c3128f84077d336995d0dbc +:00d61082227649d8bb4d2be370d8e1ea16be98 +:00d62027d8801888061c0672cb621f46f2490d +:00d630f5cf9ba7d06dc1cdd66d54a2d637ebeb +:00d640cb16c6a58d798d68fd70f2add67f089b +:00d650803b4c2babc9c40e0bc95a3d06459c20 +:00d6606d652043105cc00ec9e5023c08d50305 +:00d670e5c2bf6199262e2e352e94a492fd4151 +:00d6808e7a5fa1ef43c33531d4d4367a647289 +:00d690fbcbd7776893582992ed3167c0ce3e0e +:00d6a007858fa6e243e95d9f2f2c492256b212 +:00d6b01c973dfaa8fdaae9d6d2029733335fc6 +:00d6c038b958336ea557ede39861048e2e1005 +:00d6d06e9d6ca6a91a0052984e54dce90c92ba +:00d6e0baa10c6324c5411f66ed566a607c890f +:00d6f04e743d3db593bca77ca1ff8da78ece2f +:00d700a9a08aafdd2bfb15d86966c38e256522 +:00d71082891f790f7185b8173ab78f142335ff +:00d7209d0b9cbdd7290e9202e51ad77c156eea +:00d7306fbe212070a17c52df1cd8d3e5092e9f +:00d740287d69efb3e94729d1c4f5a3a3e611c1 +:00d750ddf314c08057818342d2ac304af574a2 +:00d760d760b0dbc027e7542a104fdd271da5a2 +:00d770238fa94c7acf70cb8f9924b32a3b6d0d +:00d780026d89f9bb8c6f76f4b75f15b02e3ce0 +:00d790fd27797b26b61d8b5d56a83f8b3a86b5 +:00d7a0f6dfdf6b8ffac8283f8c1c3254a3fd2c +:00d7b09e535cf7ecec7831c91a59130fba8089 +:00d7c000082b55e2a0c764e4d0e8c3f26b4463 +:00d7d0641053c8964626b57e23c14bf4ded992 +:00d7e06960495c89670b27e07ff0a7bf7aba67 +:00d7f0a4833a8b098371947ba9345ccfa02b06 +:00d80018879e3e958df9abdd0f37ccd982aef9 +:00d8102f7948019fad6129225b5b01c1485d1d +:00d8204ba4d83a65e46cf85603e04461bde138 +:00d8305e7e86662cafbb94bc89718300aae21a +:00d8404d9745e30cc2147748c5ef78f3ceb245 +:00d8509bace93321baf1518f24a777e09f4004 +:00d8606ca8cafb492410342b04ddf98e489e08 +:00d87022826aabe1eb0760b4bc2b774c83016c +:00d88087d004996ccad90c6225ff277e6d75bd +:00d890f5b228703161897e39f513866cb1a2f3 +:00d8a087a90ade535e40d2030d59bea350ad7a +:00d8b0db50f69b751bf082b6d695b06557d2a7 +:00d8c0e8e4487101d24d4451d8ca48c6d277e1 +:00d8d01f684e8a3912752ef16f54dd72c51270 +:00d8e09d6ea6aea8441dda18653bc54db69b70 +:00d8f0402602b7765514f2df40c555563a00a5 +:00d90084396d91f0e3921ac85449d127f5c156 +:00d9100c6f7277c67df49eae6c28738e888484 +:00d920ca5a51d0d80fa0c2ba0f73c85c7923db +:00d930fe7362eaf861e24bbe5a7924a5999190 +:00d94061325517beefbad139fcc9a0af8f6a73 +:00d950659db3a1c979d053adf2fcbcedf3ed6a +:00d960f10fbc21efb3aa1ee499fca09b98bd86 +:00d970b4ab56143c1dbcf585ed05f89b47383d +:00d980271a05e8de5ccbb682df80add798ed0b +:00d990fa313f4824f4cdc16b1b7dc1906a7e20 +:00d9a036e9024a0a7d6cdfcf542c20ef20f734 +:00d9b0bc7c327be96766d023588cb45846d37a +:00d9c09a4efc2a84495c3fae3a037e313a1559 +:00d9d0a29e4216da4975df82c362dc3ba913c7 +:00d9e09fef735a7dfb548affece88e2ae1b1a0 +:00d9f0750637bf33f99571e7f8083587618ae6 +:00da004644ecd58acffad0d1d73a73de10a091 +:00da101a9747dff7fbd011371effd2df66c702 +:00da2021108ebe306b53cd97f30d2620c94a8c +:00da301e3697533cf250e475b55cabe9aac3f9 +:00da40f02151f0dfcd6272bf548e0c77b443ef +:00da507b1e4d93492820fdd36af99f0e13d457 +:00da60821a818db5ba6feb7cb7efb9b3a45292 +:00da70c24f1d76888aef9c88d2256b66018075 +:00da80485d847ba5731f0817d6a4c0ef790a06 +:00da909b84057aa3e38a9157b8e3e7c31e1d29 +:00daa029956fa02e5dfaba98a35d29949f52d5 +:00dab07084c027b8441100696228f4433b0f07 +:00dac0d0d7338ddf222e593ed5e30dde405e9a +:00dad059a9d00b9962d914f3b636eb9e344c37 +:00dae0e311a7b8ea33bc7c065d32599256ba90 +:00daf090d28062b8eea38c94e780b21da18ca9 +:00db00532a3aa2d6637845898dc1d360130611 +:00db106c246b6adbcdb596df3c8cf19b28a266 +:00db20916e338bcfdb7e789959e1cdc8b1c9ba +:00db30fa9b75b924246b17c0653a92bc2cfa86 +:00db40c20c58b11073068342f641f0bcd21412 +:00db502cf11afad0e5feec3a710512b9f28b2e +:00db60762a51939fa997de58ed6b9e3cbc9221 +:00db702e0d6ce81f6a71a4580ee11d1dc684d0 +:00db803ebfef5d3cd6e144214a858fbc513975 +:00db90265ee0b3d9d544a474b4ca6fe0486c63 +:00dba0455038c8f96650a0728ef2621ebb5436 +:00dbb0ee4a7674efad40eb4ca55c2a2a098db6 +:00dbc04554fb00c2e0208eb90a559942cf0d96 +:00dbd01fd4b1695ddc0f09758415be2a80ca8b +:00dbe0b08793f1b845805648fa1af772a64929 +:00dbf05ef87aebc630bd7346fe11be96b51d08 +:00dc00bacfb0eaec1dfe5b6f6c470dece5f370 +:00dc1094853d5aacbd0a505a1a6c7260a303ac +:00dc20b48f9d02185a87feb6cdb6fb72ac3c7e +:00dc30469108c445c0e128aaf5bcfe410c77d7 +:00dc403191956595e1d55b75bb22afaf2bd58a +:00dc502b45e0724ecabcbbcd90e793d08c88f8 +:00dc60b64684d61f9913cac9cbf048a4e21bd6 +:00dc7005c1f93c71d2da4bdeae664a6b30f869 +:00dc804934c12f413cf04c53ad2383fa5d2f8f +:00dc904be3b96528c35f099fa58bd85ce2f5c5 +:00dca0985b7025e2608df02a8a4e92d24d9371 +:00dcb0ca27a509966a049d68ac7103621900ff +:00dcc0e54e5f7aebb40ec0748018ee1ed064b9 +:00dcd0608bb7ba9265a045e9841afe7d8ccf63 +:00dce0c07020f85f4ed4f8f4b1e3960a1a641d +:00dcf019055809bb5e3ce8426a474f2530b2f6 +:00dd007436d6eef133610d1c789f0b3df77b05 +:00dd10cfd7cd47c2a574476f7924ae6e754896 +:00dd201ddadd2272cffc8aaa7aa6c832e2c128 +:00dd3016b5a48fc46f46381208558c06b08544 +:00dd4094aaeed6dfbb43fa027b3e241d3f638c +:00dd50896bea561231a3c02f6a1965c427b0df +:00dd60fdbed642f23673594479e316e0921e49 +:00dd70f770a00121816800dc61a4aa73accca3 +:00dd80cb2c60abf60ed11bcb99cb8adf429ee7 +:00dd909bf5420f67a60e63c007142ca37cac82 +:00dda0643bc3815cd1eb78e59188b342a669cb +:00ddb0dcbe97efd9515e1bf74056ca0ae8f7f9 +:00ddc0b8f7c25a77f159c7dd7fc4ef7a9aabe3 +:00ddd011874849933874ff45c3717a7c1af88e +:00dde0c313c3d2b658ce55d9dccd44aadcb800 +:00ddf03cb189977dab7254ead77a6154c53e27 +:00de00703c7e1ee525bfb2996f961385773120 +:00de10e65a6de982e140b0b8fe561a4b75f36f +:00de20513027bfd98985dd68b9cf270dfa5678 +:00de305f74de2e28b49f0f4309513054467a56 +:00de403788935de6396880ec85b3aae0b5c1fe +:00de50957c2043bbc54ac6802e085bc73d81db +:00de60821684ae0ada854759906b32287a3511 +:00de703b69a6bcd4a0c5be2868977bd4a38b12 +:00de8077a91983a49176448f45140d9ae1cc03 +:00de90c54c330770c527bc314bbc15a554eaad +:00dea0b17a047f4de52485110969f24f435bb5 +:00deb009f222bff9384337b182da3c3d593cc9 +:00dec0ddd1a761ef4500b584aa99191a867c04 +:00ded0938599f3cba9b8961090f53b8eb1dcd4 +:00dee03e9b56f0236a1a34d4103944fe958fd8 +:00def08583600f0a5cf1b24a840be1b167e687 +:00df0042077c4ec7af15cd94bab54a2bcedee6 +:00df1031b17d902d762285ee70127009018580 +:00df205e4da16351945b03aa8cc5d2489736f5 +:00df30e07955cdb63b992e060047a735b86a25 +:00df404f0fb1f1bdcf618957aba874cf4dc546 +:00df50d5c2287ccc7b0a3500c2e0cd512bb5c5 +:00df60aae40181b62fe24a3bc7341ef70a7e9f +:00df7095acc651dab6c89ce8f360d3741d9389 +:00df80325a1ee36c096f28ec86ae1c7213d8d3 +:00df90f70652982d49b7938824a56f4b09681a +:00dfa0c86cd6eaaa25e6b6c56c2c42d6329b89 +:00dfb09493cc35f60b4d2849d6d4e775bcf261 +:00dfc0266daf30447e3f1620664a58f77dc297 +:00dfd0f8f92e90c7d2d0b61ccce37f9995dd42 +:00dfe052aad1ed4f4522fa4c96d7d46f804c0c +:00dff03c491379c085f7e49fc0053b229f0400 +:00e00018aeada5bd6df6a993576308b9ca31f4 +:00e010a75b7630ff0082dff5e77e916781f251 +:00e020587a695e67251c3d01e2959413cd6179 +:00e0306ce05ab23dac1942e267ef95ad744909 +:00e040f8cfb5447649695d978eec942db4149a +:00e050981cf2fd243342445de5468ef00879ed +:00e06069cad4044db9cb34e9906da42a8eefa4 +:00e07005b78c5ddcc302162eaf0b504cdf0d92 +:00e080955e4ee68469915cface6a1198d9f98a +:00e090cb8863627e9f764446d5303dc622b12e +:00e0a0141c6d44ebd900d0cb24183eccca8a51 +:00e0b0cdbf2b5d0242b6855902c01f17e46f4d +:00e0c00b7ed7c543959cfd6afa4a0b72c6dbbe +:00e0d0ed61f2460c3f15ac45334fa8d4685947 +:00e0e0cd5e3f5a6b223c055c422678db5ef45e +:00e0f08904b2645fe7c6a748cda87fcbb46a7b +:00e100a93145c2a4a78fa543ffe0b93bfcdd57 +:00e1103a68d016041b35eb5b069bd9f444ac92 +:00e1205fac5be756805fb7bb953b8b1c79eb08 +:00e130aaf3b76454624a80fdc4d0ede1aede1d +:00e140678a4c07dbe989a3addb422fc05f35c6 +:00e150c865329f077debd4034ead8198f6cfc9 +:00e1607b5be7494669fd9ee03e0e620128d81a +:00e170db2fe7fbfa587b8ea1fd620568b4a63f +:00e180310675d89af038a47637aea890508228 +:00e190e9b2e8f84c1bae93212ac9fec190790c +:00e1a0cf28ac4d623e355c8e24ab14238126ef +:00e1b0c0eab2f004645ff1c1ff246b04280226 +:00e1c01db19d8d2affc10c2d9a8776d10a1fe4 +:00e1d0e6433d25c8224a314d80990c44c5d6cc +:00e1e0538e4f3d33de05d8103157dc801e5a47 +:00e1f07dcca3758e970248c90ba57324473af1 +:00e20071d36d51ae2ac8e48d2636a3e1c2bc70 +:00e210018531804d211554a1eda77bc1629e30 +:00e220a11f6ce4a8824b3216d8034b42d2b72c +:00e23021d070b1046651a9ce401088870e8000 +:00e240caa094fa2418a80ca1f91288d5b70fb8 +:00e2500acd2f0850191aadf599243fcb884eed +:00e2603ea603e9fd8439906f2fcaa88fdc4467 +:00e270dbe13e4907d43b8d3676551aa56c7e9d +:00e28027651ddbe0b8ce39c8060d956cc0e01b +:00e29064bf9cabac142db90271697dfe313f57 +:00e2a006a506c0b88fad41a4d0693dd7cfc183 +:00e2b07bb97ad9cb364509552055447d79442d +:00e2c007065030b2fed53243e59d0cb4f4a41b +:00e2d073e435211449f610c03342135f8d217e +:00e2e067e0ec8cb92fc6dc0b555876b1d24221 +:00e2f072f1cd1a605ec61d4f4f0c4b427afa6d +:00e300d9f00c4e32de33a3b6b825ae65bd64ff +:00e310059cfa9fa24fe5ef62b53895a4bca908 +:00e3208ff30b7754f12a8fdebabd10432006b8 +:00e3305805ef1d8dd31aa7ff195d1f8ccb63e8 +:00e3401a07fff5162218e54e28340ab4f9ad00 +:00e35036589cc266a52a01cd27b754d889ee2d +:00e360bd1541ce84237cc6b55a167f4b2eff99 +:00e3705fe7a356f0e2899645ea86e049f0af6f +:00e3806b4517b73c6860f2925fa328f33ec368 +:00e3905ae69e48b12833de4c9fa70e6780b64b +:00e3a0066982bf0a8c6ef8d53ad42ef7f62074 +:00e3b0983efbb53690a8e473d6a6c6d1b300ed +:00e3c0c91dad2288a9d41521b30dac991eff46 +:00e3d09ca0d618fb6e2f3a6d4102f66d9a3255 +:00e3e07f758b607e600f953a927d48144dc0f7 +:00e3f0c533b265af7c92654803ba25cbfcb6d2 +:00e400c4acba3428f93fdb41a50614a076f2e6 +:00e410ea64209e3ba0a7602343b4636368a588 +:00e420bb1ad4b71146106b2ce0f7543d871f2e +:00e430b2c0793299dfbdce3cdbd033481c4565 +:00e4402c7f7686bb5dab2ceec600853564c2b4 +:00e4504f8f42f21434ff34798f21fdb37f66eb +:00e4601c4595685ab08522f798bdf1ee4c7978 +:00e470f832394f1a5707208a8b96ca90afac5c +:00e4808f7bc9827a3b6b26a269157dd14476ec +:00e49074d9c27f88233c7e2f75ba5800f98a44 +:00e4a064ad40df17db4c446b6def64fe430101 +:00e4b0dad19e0225ff7df6631a38c5aaf645e4 +:00e4c0577d4ee5e9a35777454bec66036839a5 +:00e4d04303a07f6f785f6b03ac21dae4101de6 +:00e4e0580487a992a0857e9007429cc1c43fb1 +:00e4f0c0cf3027c3f4d90959a763bad2edffd2 +:00e500ce2bd04d1937af0fc931bd382cafe736 +:00e510f73e63ec14e2ea4ae690bba8be069564 +:00e52069725ac7e70c03681e695346ae747c49 +:00e5303cd9f6895eee32096b04ff7c385ee0ce +:00e5406273804a4ba69a0e15606e60777de47d +:00e5508a313310920a45f0eba18ae2203d032d +:00e560f613d743288b5e7b3ce3500f943a340c +:00e5703971208360904b3d6a58d5654150d2aa +:00e580313437852535fba89139143afdaa8ee6 +:00e590c0046cbad1ae209a4a3a3b5150f57e09 +:00e5a04b74a62a3f83bf38b8a05762b0b0a841 +:00e5b0e81a9bda02005e5580126a7ed1a2cd42 +:00e5c0dce0421bbff78101ed24cbe171170196 +:00e5d01d32867a53eb17a6cfe63804a4624f44 +:00e5e0e74d6d34a9af6e03792ea542dda5e712 +:00e5f079b78cdafcd14464aa4a3d282e23e226 +:00e600d4786ef451ac8bca770de2792e7ad8fa +:00e610de7f322c2b86170a01403c1c02da1095 +:00e6207829ad38767a942ade1808847daa03c7 +:00e63095c220fde377aa762840846ca552fd3f +:00e64092f410a8c634a05e36a0724c3e647075 +:00e6507401ec601d97b6ee025247e865cbc99e +:00e6601d0d339e89edecf5b2ac1ff1fd958264 +:00e67045dae404dcb6cd48f13faf049f769a77 +:00e6806450653b83292fe45caf1bcfa41e0669 +:00e690eabbb9b529898a7f89093310aa4e4f8e +:00e6a05c28227a7a8e85df0c95a70bfef58e2e +:00e6b0009a25908460c8aca0bf2b4bdf789d2d +:00e6c0b3e0fcffc0ab34829b7ebc84fb9a1424 +:00e6d0764f3cbfebf39540960d002cd556c8fd +:00e6e0bbf810dd2eb80922ab712f662bbfc745 +:00e6f0a7766311f2d74d8c1f36dee752f74538 +:00e700277410d27cbb1658d8e30b769039a10a +:00e71014a6b3a65992fa20492e9f6294277ec4 +:00e720a81a48237f15300154956434e96e22d4 +:00e730bb2bde4c20822104bfc3ffb6356dc57b +:00e7407ecdf432163507ae7432784ecf0e58bf +:00e750fc3211e7cf144f6063d7c4545880fa9b +:00e76082664f41545dd5ee6bc2652684490811 +:00e7706e8038c852a8fa20f45153d6f073b4ab +:00e780876b16e6bd63d8f12a863daba71a51e5 +:00e790d9a0ce718a5946179f9d9935c4391aef +:00e7a09ffb95700ee8f21de46e64f84e8a0c74 +:00e7b055744743d58e14b6584e624a9d707fd1 +:00e7c0b85cbc93282019eaceaf3411da01fa08 +:00e7d0445392047008927ab364b92751340fba +:00e7e073a9a401df2bbfd6d8d85fb3f4437571 +:00e7f063ca25435a094e456cbc7891cbc0be65 +:00e8005a19b0683b8e15bcf5667864e563ced0 +:00e81043fb514ac0897af38676e0552cae536f +:00e8202d1e2d726bb3af2d7b1cd880e37af079 +:00e830081b0ef72e0e1cc2c081ce282fa51f3d +:00e84035b2a0dc1287c50b8294f572ce09ad99 +:00e850f79623883ae41f1f7268a654acd0fe25 +:00e860fcc1e2e428084bc3068dea14aff0f5b5 +:00e8700dd36288c92be6f4b514e063391e0b0f +:00e880a4ae9b416070e65797ed7149687d3392 +:00e890b940d245dc1267a2e0dfcb5f0b493b94 +:00e8a04c6e691e89c22a82dee7e79bd30f86d1 +:00e8b04ad62375ced400038aa9c54141b24c52 +:00e8c0ca66cdc4260f488e17316a3e03bd50fc +:00e8d02ded2087304a58e3c144b26a38c4e209 +:00e8e0c66cb9002846501dcce9ddba1eedc9f6 +:00e8f06058f88fdd59dbc578130c129e4e0da8 +:00e900d52c773b9a1ead3e289f66642bb265c4 +:00e910083f89dacd20f1b0fcb515dbdda1f4fb +:00e920abe27657e5925b12aa2561dde4ca97f9 +:00e930a665c2103a550b4a5c36a24540395c42 +:00e940cb090b8244ad2eca2aea7a813a5d3473 +:00e9505925bec3ed17f3ede2c00eef8e3a3054 +:00e96046b74d2be5fd3bded4d9ea01c535590d +:00e970e2d23dd089e429e6ab68eaffa8909538 +:00e980785ab105c48b45ec4e73ebce64b06430 +:00e9900946244e974705b4ad674c402fd8ad11 +:00e9a0f0fe1bdbfb922105b4e0baafbcc86bfa +:00e9b09a098b077ddec4a23226448e6d454848 +:00e9c0c8a3ac43fe1b61e4cd1b9c1cdd7a2c48 +:00e9d014b3a5f510b739f94c706416b60241b5 +:00e9e0aebc9c3300fdaec8309a576fea4e112f +:00e9f00395888e16a0c6c19b376b9570775ca1 +:00ea00bb3fe342a535c9162fdde87e65e91fff +:00ea10cb9f864576527583ce906485e91d9c95 +:00ea20b4c7c72caa506bb43e3a5bbbc698ea6b +:00ea30d788a56f16592c3a1d1d77ca7e13c931 +:00ea400e5cd7e4918785118e39b5c0d611ac6e +:00ea502a87a89aff83e1e6eead5ec8e38ff249 +:00ea6040b42a715ea0176334c88a0ba56dba68 +:00ea70fbc36cf3f3f3b07b49f71b248edabc5a +:00ea80c123f98fff0060d928ac1752df224f59 +:00ea90c50973f7d6f454b719fd58010165eae4 +:00eaa0964930473fd12412473ccd0585fe75ed +:00eab0bd11277dfa511cd108d0528884f53508 +:00eac07ed27687496cc855ce6446df75b769db +:00ead06e0f95c4fdecfbc795c5e5634003c5be +:00eae073534cec799185bcbe8c6ab3c762febe +:00eaf047e7887d79489fdec32ae9fbd5fc5063 +:00eb00dff2a459e12367e808c8605cbea3feb8 +:00eb10b0f042b8bc2bedc074404df6632c32d4 +:00eb208e06c7d2638b8f77232d14510e4b4350 +:00eb302b1c4467f82284df9301a2545484e289 +:00eb40fe6ae69391fc4b74b539d517fd82f054 +:00eb504d01d1873e615fec5c8d0706884a552c +:00eb603691863b0a211778b68ba7c3b27a11c3 +:00eb709b5fedbdce30d8d74b80d766a09a9116 +:00eb809de5bfa337b720f73040b5e18e8eb15b +:00eb905c5d2b032e5a41222b931ee842bd0fa9 +:00eba047888c80a84e7977ec21c85c7b1f4053 +:00ebb0324565b6fde3a5aa426b520365649b45 +:00ebc06ec88e33029a112ef69cc80235901f69 +:00ebd0315916a7904ed879b40c95d1fdbe7e98 +:00ebe08338564d5e69181ef8800e50f7c9e611 +:00ebf0af7d519a6a1b89383371b8daa2aa2747 +:00ec00db517b8039ffbe01fb588026d20bf903 +:00ec10ac4da081a4f0f5967ed6114aa060c710 +:00ec206a8291eb2486058fb565c914676bcf28 +:00ec30d5eef22608ae7c68767dbcdf7037cca7 +:00ec405c4ab9c4213375b411db595aae036638 +:00ec50bb9c782da09cb0de973b3ef8be0636d6 +:00ec60d1fcac3b78946ffdbfa638e90996e1aa +:00ec70f43adaa42ead3f4798050f0e33c0ea9f +:00ec800435b485ac479fe63cf710a1a0deb672 +:00ec90acb5ce6981e4071bdd6fd75937d4a8e1 +:00eca055e655dbadfae5f2efb2ba5f8a6af7fd +:00ecb079f3820ae70ed2c34dc6e48620b9ddb7 +:00ecc0549c02677d28cf7200f361b3cd189547 +:00ecd0d66864bc88ac3bdaa3f61af48a1c4882 +:00ece0fb6b5700adf1df5290577f4646bd442b +:00ecf0d175ea098c771bbf8423b7c76eb71c6b +:00ed0068c3233d00c71c10a986c68630b42dbc +:00ed10fc11b0a7fadd590a23fb196ac001fa98 +:00ed2078abf2082c8c5cbbb95b26306c14bf54 +:00ed302397756793362ab20db6b70342c9d3ca +:00ed4080b20a87061123e9f4a1f952bfbfdc96 +:00ed50edb122107a30ef4b2a5dcf36bb09a13d +:00ed60cf7595d7778450e0e8853cf0fd7ca02a +:00ed70818f434f813793c06fd544b37d19b5d0 +:00ed80265c931113a267c811469e4fc085fe3b +:00ed90c1303e7a5a3ad9c3fcba7ce28bc3d988 +:00eda05e31737e586fc5637e562ea2a47fc340 +:00edb0a62628da53d7d88c7d08c666e568846a +:00edc08d61aba107a75b5b9d624f6625da0f18 +:00edd0bee7a83a8c00e1a346487deadb4dd4cc +:00ede041a98266c68f53acb71882da9a84740d +:00edf03a99a9558018235f5f5d02b7b7bfe8b7 +:00ee001b0877c4d6660a61d147e3e0e2610945 +:00ee10c645ad06426369140870762d47b31886 +:00ee202a6ddf94a6a008976e1e0e5859dc45e4 +:00ee30cc9144d617a8f607d9c150ee9a968b86 +:00ee4059ad9cd35eb12351f7dcf0ab239a677c +:00ee5062e173731d2a6327878991cf05095d3f +:00ee608d94079603b1ffeff14fbaa1ee403dcf +:00ee7026693e6f99997ad0456980481c3bb3ff +:00ee809a7c031ed90b643a42e8225ed20ca458 +:00ee90c62b257738e3142be9076a80add7fa2e +:00eea017cbae936273e72b6d1cf01ce09d2cec +:00eeb038c8eb77df793534f22be91a10eceece +:00eec01c3cabf41a093717046e48fac39f10ea +:00eed02feb3a17b28fa10de88263f5b052c8a6 +:00eee037b81bdfd724ef4e78abbeee6e2ef14a +:00eef0967c3d034f2756ba9ff572c4714e6717 +:00ef00ee1a5ea48ffbd52c666c876d826f6e33 +:00ef10b586a3c92b78ffdc9602937b8a6ad0f7 +:00ef2053e397b1644dc9261105551b68cdcbb7 +:00ef3077f9c4ad70b36fd82307465ed2e89738 +:00ef40cc8035c110d93f71a44390bdd74dc6c5 +:00ef50136c803c94c6222dbdba39fedc4e3aef +:00ef60dff4424fbfe4f53db10e190390d72ea4 +:00ef709e0394aa477af47fc0f0123bb0432ee4 +:00ef8085752be18e9a703a34803a83064937ef +:00ef90b1864a3288dce144b523699b60a57a7a +:00efa0f32681155b3a141e8eb750bd75ed6578 +:00efb0295b66895ec0cb61bf5125955099ebda +:00efc0875c577fd97324adcb7e8720fbe62cb0 +:00efd0db1306e039fbb879f7a3d3106d1c2c6e +:00efe01eb9199256fc57f5cbbe6044d0c232bf +:00eff077d6e21f4b03b6c31295219ec89ca409 +:00f0005f2611b3d923ad7d6d673876328339ca +:00f01003a41804ed331d3fc7176f6713960df2 +:00f02092a837a361af8466f68a6e4f7db07f00 +:00f0304321b954af6b115a28f7adbe51b3aa14 +:00f040a3f63021464ac3e2f7b1c7db513b90f9 +:00f05043da276b0e86f7eeda80a4085d10fd62 +:00f06052b0917587ccaec3991b529a74bf7396 +:00f0707326a11e366944ac55459ac21c22e131 +:00f0807142f11881ce63e97ecb7b126bb2e831 +:00f090d9a70d9a8a816439572a3351b17d6873 +:00f0a00a5f19a46c8f02d74b0adc6f3becf48e +:00f0b0092a8dae4233b2f257a542f03667ac75 +:00f0c02f1951f67baffac255dcf2481980bd5f +:00f0d0229ce0cd6bc7ae12812358826f289fbf +:00f0e058d650d7472d545beebe807bff2326c3 +:00f0f05eefa3e94a8b5a6273be03da59eb8be7 +:00f100130bcaa469613e4c8054dd8a0df2ba0f +:00f110188c01848896a84513ffd352276403ef +:00f120d6cbc16df8a2314f8f52c67ba7b029e5 +:00f1309db8cfdb6b72ed8577c50dcc5333062e +:00f1407bb70661ebdc560f37a2f3a7b8a0162a +:00f150057dfaac989c5da2fed266d426bde11b +:00f16030a4fa6509e4bdd158a86a6c6da0cdb8 +:00f170aa83a8cbda314b3c9848c75627a16025 +:00f1808d9ebf6da39f49238cce3d296fbf0fef +:00f19077034d248374038597a1d25ca5f6e92c +:00f1a0eed36ce2b4215e0251b82a18697b5bb3 +:00f1b0b9af9f684a9d198e4c79441598e23a9a +:00f1c0102f33ed3fea540914c747d6298cc1e1 +:00f1d0c56781e93bcce28167bc27e9a6ed2ccd +:00f1e0e8d147e15f225eb7b087bbb81dc4f56c +:00f1f0e21f703bf270194f1a070350616ccfac +:00f2000a1a6b44b040c904f18582bf81c52ea1 +:00f2103a5f8075d95d450a14276ff89aa1c9d5 +:00f220c35d496e71c92da11756aae29b8175b3 +:00f2300655537e7415dce6bbb0b275dab83abe +:00f240a42e66f55b03fe024cca2dd7d0bf5b3c +:00f250451929b35625f2bec0e37c5233547891 +:00f26018fe0dbe6af1b2413c4c473b506b205e +:00f270f9301510e101484daccdd9c6483494f8 +:00f280e37924852812de46424523f25f93a92a +:00f290ecce056e47c9acd4c5b4143a3db21fb2 +:00f2a00df0b3685e6c51fd8c06f5de3e17a79c +:00f2b069450f7a29522fc0eda4a44fa2f5e250 +:00f2c0b4ef595b1b090de190803183ddc9d6f1 +:00f2d093b0c6911aefcf5d41a0fb976e6d8fbf +:00f2e038143819d291f1cc82524cd661d05e0c +:00f2f06c5ab8fe498dff50014ad87855b21698 +:00f30018c950a8218a83fab6e15e2dbc05f6f0 +:00f31022eff9ca44dbd69239524166229bb9a3 +:00f320257f51ec6098288986a4a56895527e93 +:00f3301642e4968ef88b8b9b4f42bf6e6872cb +:00f340d1516daa4e77ac4be0e197a6369fb43e +:00f35060165b30ca1af1f388e6a53746af44ae +:00f360cb394a0ea0a48fb44cbe0320d9d8d7dc +:00f37042df7a29356b7d26f00ff5ae7c37e048 +:00f380c02c49169cda7bf5d54476fa106f1f3b +:00f390cecb68fe487b6de3c847cb18042f0d9f +:00f3a0a9a2fcd755fc9dab2f02b70d910cbaf3 +:00f3b0792e9811484d81ae281ca5bf129c9570 +:00f3c0d905b9d2a49c58209b24793db72a986f +:00f3d0976d3eaf9aa426315d10b6d909cae616 +:00f3e00445178d18e6f3d6f76a8cd9272be8bf +:00f3f0cd8b0732aac04a8e03b7d38f93ddc176 +:00f400710460b1835eda544992413c98f871b2 +:00f41042c105d316b2fe616e7aff6e715ca59f +:00f420100f67f436bedbcfef78816afabb4ae4 +:00f43068ed0d48ed96ab27cb2e16dac9e5cb1d +:00f4405438b3ef29bd214cb8f38f4d183bffe1 +:00f45058918316f26fafca582ce0af28137325 +:00f4606d6ce1c99bdda5d9a20714cdae63a7f3 +:00f470d9a4025eb00c16add53e5311a6ed94e0 +:00f4801c6a8e659818714c30e65bb3c254dc4c +:00f490dec53cdb286d12d895cf2508475bc980 +:00f4a08637c4f2279c06935b75aaea5fdc7654 +:00f4b02f42f612a9994694f1661ea311104fcc +:00f4c07bf47ffc48549d82f3f833d466f921f4 +:00f4d023f48e1a88043554dd0edbdc4580ec9d +:00f4e0edbebc8b39aff9e5ba3db6ac397d3cc7 +:00f4f023851489d96291f706a02527e7b22102 +:00f5005ec8d1e3e90c81d6c48a4716a53b063a +:00f510a4c758936f4bbe86520d591f7e80fbdb +:00f52040736ef9f710565be980851273c058ac +:00f530c7fda3fe4d2f70045d240a8b0a918f3d +:00f540c7fa5d787a9a0714e45e793a9e66ce8f +:00f5508bcd0411414b4832b3cf9ff28d562d55 +:00f5609b180e62ec46ee7cb71d60c846c1f35a +:00f5700b9f4a8b51e13c94329d4e6446c52d44 +:00f5804d637fa5156b8fc4d9644f55fc889b91 +:00f590798393a0bf26a32601ab9a3ebf1fd988 +:00f5a0ee7f6618aeb22ac8f9f16e42cd087442 +:00f5b09c37979773f5b9ed288e66f037d72500 +:00f5c096be09721bf1b4de679c4139bef50a57 +:00f5d0bfd6823193f737f61c151e1ad031ca52 +:00f5e05c73905400f0097f61312f4bd32f8442 +:00f5f05906b6360df4932878712af7e241356a +:00f60073aed2d4569a2178e7d3090236d8a237 +:00f6101283150256cb7a1224ec3262d8c1d280 +:00f620ec2abc78e1012e7ef24ce83632055031 +:00f6302915a6e0febe7cb0b44215c204931d34 +:00f6407ce86f352fbb685414342de616864298 +:00f650e21b484635fc43f698699b87be76bdcd +:00f660947da5bfcb497d0a9780427ba22ada0b +:00f670abd69a2105d756be27e56697009c1d59 +:00f680a9b40c2b78e414490fa411540ef3a32f +:00f69082ae30ed6d2b0aed7852d4cd8d16ccef +:00f6a0a4c7a6c23821c2e4ad8ba350f9ef1640 +:00f6b089ed8f492a53f673a5bbbc4e05b6ae36 +:00f6c0028759b118af067f1cc3d2b4b4de6a23 +:00f6d0075f20b76520049fda5ccf6f92a29a04 +:00f6e06780ebabd282a1d61be8659ac88179af +:00f6f0728ee8c945eb4ec8b3fa4b8ebc8ad7f4 +:00f700bc0649bb04989d003ddae9cba7534aa5 +:00f71042225764261a44d85d21efeccd11e55d +:00f7206a3cf197c8d6863cb00410c4367a9680 +:00f730dc660c67d3e6545a5210b6b5ccaa25d2 +:00f740aeae5fb496f3dcfff3a8376fbae355b1 +:00f750c8b89b16533263a014cd7a16ec36d51b +:00f76064b2f020487d7c257e68809e667e412f +:00f7704d404fbf607fb4459e0f68c83ea3e003 +:00f780ffb9a7cd2079f870e60e72c0f8611f9f +:00f790e2fd28e14589456fd3e049805f653fa0 +:00f7a035a0f6dc64461e649f161da75751e09b +:00f7b07438e2a6bc73efc3fb0a0bda579bbe7d +:00f7c039baba8acf205a55ded21cf789c3f661 +:00f7d0159e30dca15b4e1ff4117c1da01e3172 +:00f7e036a3644a044e27121393f320c6be3deb +:00f7f040d1ba871f0d5dd56a4b28220b1a2864 +:00f8001002d3f4c5140fdf17d58d3198467020 +:00f810ab768c6f3005a766d4bfeb9b5ae95ed8 +:00f820212da854ea2148be9d6f7095bc394cff +:00f83068741862e559cbd711c85e8bcf2376bd +:00f840b46f3ea31d75b4b7635bbfe9bb2d576a +:00f850c078bfbe1e688f441e6c0b0baee52eb7 +:00f8602e7d8dbbe6cd3c536bf04a117fe5b8e3 +:00f87042886b8698a1c44b06941f541b5feaa9 +:00f880818cc1a0f113620790cef3f323cccc5c +:00f89039bf9bad68a78ebd9d7dc5dc1d6dc5c1 +:00f8a0c9657082b7594fc9048137e2203b9975 +:00f8b010b7d46b4eb5eaf4e6da2a12a52e40a5 +:00f8c0b276f8081bfc35eb97edd88a3b083601 +:00f8d0c02ce34a73048ff2a72eb7b0f3fdf61a +:00f8e0be19782f9c54a83fe8beebaae60c9cea +:00f8f08938e4eef62386ba852c867a3e4f2006 +:00f90017874805fa8ea08c87335df5bdae5b18 +:00f91000152ccc3a2d63660f81fa87ac2ec91f +:00f920defc7c479b38f7fb66fc83c184753bab +:00f930b51dc3d4cb07c5f6bcff3cb0c47a64bd +:00f940034b6cb6d3c3569a7fa1c834b0f799bc +:00f9501f1d122267dbe6f3d07a8e13e83d7a68 +:00f96084cd4c80adefe05fca8bad513d646046 +:00f9706d73ef8a4de2e7ef8594d4af137fc0fe +:00f98075cb3da43f5cd958ad603cc17ff191b1 +:00f990d15537b33da2448fef3012a42c54d88b +:00f9a068fb57f7fffd81d852ebdc56c2acc8f9 +:00f9b016fd865a484a4901e5f2d98f5330cb71 +:00f9c02c10ea28750fa5d0f97f864497c504b3 +:00f9d08785561ec12b22142ef3f9e18e423131 +:00f9e06cab2b07f0c39e60f6bdc5555427132d +:00f9f0fe438a474a450f193c034315d40804b8 +:00fa00390bfa83a225fb2eca4d6b0f05943b51 +:00fa10e531b4a8ce0d2c67ae56858128d7768c +:00fa203103b8dadec7418477389d10602d7c42 +:00fa30dc424c965b95d75c3d25f55549abef00 +:00fa40db37894f63486082cacc27315452f564 +:00fa50bee379748244660e29380497541d7bcd +:00fa606616ef807daffa75f7ccfd4cbdcf35f1 +:00fa7079eb23030705cc19f52974c9ea9205e0 +:00fa8073ec427aa192b9cb1e70f836bd47c008 +:00fa90f05d73a5d92eecbc9401d8c0c352b362 +:00faa0aa8cd00fdc352c2fac2a090542c97dd6 +:00fab09e8065014f9e3c34ac6bffe3d0e60e34 +:00fac0e3963915c31404beff1e24051f49d50c +:00fad0f826342e0439370e230d5fc24aa3e4f2 +:00fae0f1eb6d11bdaa76af1c935b0f865faa65 +:00faf0f4708bdad73532fc65ab7dcf5c89d93f +:00fb005e5be3d8e530cb659670c18caa48304f +:00fb108849980e35f5279711e98c69377877d5 +:00fb20e9f4cdc356667198577c3b724e5db3a0 +:00fb301e1c69d4408a6be68aec1d75fe09624a +:00fb406908508dc41a2837c994d89125a3d7c7 +:00fb501068e4bce4f157a49f845da189cb0d0f +:00fb60e917d0aff0bf93b969bd4fd71262e9ae +:00fb703faba2f70afa66fd73e3d86db57675cf +:00fb80945fbc7e130005f86fccacd833bbeb90 +:00fb90b84e859d5d0f37603d1663950a7689a5 +:00fba028f7ba0554da40bde98e0a691422c351 +:00fbb05da40803eaf8b49c86cac753cdd418fd +:00fbc008c0946166bd718b20e4d398a91d91f7 +:00fbd084f557726dfab2467a121afcd326fc60 +:00fbe0b85e6d822424ea1654feda3a9ea55206 +:00fbf0edc69dedea21d40cf2188b2a21f48767 +:00fc008d87dce68258772849ad56726f74ce0c +:00fc103db6bc197c08bfd5b7a7ca3c6e2f3c97 +:00fc205bf5841339a8f7a0468fa8ee8e989fac +:00fc30b557271640929cb1c736c31e650ac0e2 +:00fc409cd86bd1f8a0ec702b42a3239453685c +:00fc50d1fb9b23d13a4e4594a3c10eba2faa23 +:00fc60955cfdf33b5a7f1edf56cf4b8d291587 +:00fc70286649271f6df88d56fb7f2c9e111753 +:00fc805b78f828d1196395f042b9b9f73a9bba +:00fc9006d047dd7b4a61db8f5fdaedb8917b8e +:00fca0a9d8b4448e71dc7f1463a46f8c1057cf +:00fcb037c25394b9039fc1299b1039534acc14 +:00fcc0e0b414609099d15bd30b6302ee5310b0 +:00fcd09fefa8153b1e3b1302688541fc859b9c +:00fce0931bf68f27131e539443014abbd1633a +:00fcf0e5830f9ee3093e4da5824fbf2f77cfce +:00fd00cd51abfc2533a583acbd892c8788caef +:00fd10566bcfd67e981a27b710a1c206425bb3 +:00fd2086a4b22da99aa36e6a058fbe61d87991 +:00fd30c44bd2ccdfc2bc4e134264946ed49921 +:00fd40e637e06a8c623999bffea17c92edd3ac +:00fd5030b1505f35dd0c728ad3c243476d5bf3 +:00fd60331c7d58a3c1e7edadac6de55f4e1efb +:00fd7081da0d0a57219e9bb0e5c16fc02568f8 +:00fd807d385faa13ecc51c28752fb74a4e117b +:00fd904daa008060b2816d0bc82f9a919b0a43 +:00fda092e29f545630e6e29636716df1d1f563 +:00fdb047c2b066f8686dbf675bc8c2048b2ca2 +:00fdc0c60d161550e10651967e2ff7f9e6a40e +:00fdd0972ff2f810340df596a4df6c9940a0f2 +:00fde0c60ca2b93e7c2be9e0049c724c9ba743 +:00fdf00fba231903fa738a9b42979627a14416 +:00fe00d6bce1423f666e89edcedaeb63a989cf +:00fe1048ffc700c0cac07c962592fb6d1fc16f +:00fe20c4773f4ee2edcddd52c06978198167b6 +:00fe30a4fa37e0d62c255bd3dfa09b896505ae +:00fe40209af8381ab2cbdfb1f4f28834cbdf4b +:00fe50277297014ace0e9e2f7408f4ef740c0a +:00fe60f6ebe8b5c4d16f169966ab9e3b669655 +:00fe70ae1400d3ab173d5ca3f009ca910cb8ab +:00fe8035d1a62be6f82d901e027d23e0af59c1 +:00fe90eb0bf87c2d0d23709f0257f84c0ec2b1 +:00fea0a0d05ca3f11de5b03aa40cdc5cf0187c +:00feb0776d3caf79cebada5f7ab9a6f25d47d2 +:00fec0b233115684d9d1ba3204cbab17bb7b6b +:00fed0f254565d76350c34b78f68728b49d568 +:00fee0e5118639abc85fcb7f91297a7a005006 +:00fef0c79ad987ee1cffb1bbf91ddae4f99ec4 +:00ff0005b27b0beff8d7665ae7af876c41310d +:00ff1074ba126885062c262cab996e30ae0c98 +:00ff20870a1ccaffdac89165c286d6808b963f +:00ff30e7d48c5860a7d79167753795f304c5e7 +:00ff400926826dc818d6894b292245539af72f +:00ff50933a53b5ae149bc60d56802750c3aa0a +:00ff60d9c01f2594a6051fff37ece05699d121 +:00ff707411b081bc7e274ce3850d67ae135e17 +:00ff806a303996366323a8ac71c7b23cb517c0 +:00ff90a3e2cd83be8950cd7eb2c6a5f3c4082d +:00ffa0362496a6d1ae3c7e75b45747c46601ba +:00ffb0ee2efca061fff0cdab1f22b2d050dce5 +:00ffc0ae50eaa8e470ad64147dada4d74ab336 +:00ffd0d2e311f733c97983b027b8b0f0e3596f +:00ffe0713ebcb67360b183b8afbd9e721b0cc6 +:00fff063ae4db7d7ba2d1c04ebad48bee6aabd +:010000f937d5c65422ce44d3cc300e4d0ade07 +:010010f5114450d89f24320e0d5ea465ffbe40 +:01002013d25213f61d090eaefb9ef774e26515 +:010030ac12225d163b2ff6f48eafadef222ae3 +:0100403faebbd000220a6af02ac959faf4d944 +:010050d5505c35ea8ad454eb6298252599c156 +:0100606b2e9cc27f3f5672b4817dcc67480c90 +:010070510e5d8b6c683a419b57155a72550ca0 +:01008009462efae483e842bb2c148f00733bd7 +:010090e165888753c20e4d81daded184377785 +:0100a07bded326bf67712c83a02cc8f7c1bebb +:0100b0ed95b716946599ce0ec31b8ecdb9265d +:0100c08975bf2951f2e3599790d76d737385de +:0100d0e714414922af8a830bc553e454997c4c +:0100e040ba3fba35aaa14bafcbe6fe6aa120c2 +:0100f0b2c6df9949ad3b265402b5f25dd87860 +:010100460e29abe43da06b4de2c5843bc17d4b +:010110b44d5e9ce626c7bcef4d71d9b486c274 +:01012079796d0492f9d004e60869e8d9a65f51 +:0101304db1dba3758c61e44241fcba8d44d880 +:010140a25baa0572e0df256cf8390182144c17 +:01015077e93372392c2d7843521b697f5c045d +:0101605f706dcd1f101e51f3d509bd22873d64 +:0101703b6aab73193167b5fde86e2e09783ab1 +:0101807242936e16594c29e9a436c07c7e992a +:0101907707a7213318960a64ca5efb9c4c6e34 +:0101a087602be153438d0149e33aaf5448e51c +:0101b0cf6fca327d0d5f985fb3c27660d46f98 +:0101c00bfefb8e192a411983dd138bdc500cf9 +:0101d0cca4e361cd4dd81f03322e5759c58e82 +:0101e0e080c156a882a7d43c36844b7875e92e +:0101f07412a15a9e407f21db5d22ac409b1a7d +:010200421f0cd8685b5301c062cc8de743738c +:010210139fd83ec0ff560c3642e5ec6d57a083 +:0102204389ef7a4b8b1c0a6cb254ff846821d3 +:010230bcef92dcc0943fc4fb6c16ff2554529c +:0102408f7b69f8c891bb2c4948e167b4609ba4 +:010250387109a1c40b1afb71dfb30fddd7e734 +:010260777888406608f32ec22b37c2bfd680e5 +:010270b581791e111d9acb3985f10e14a5d9ba +:010280e9efe82adebc94fb0b6706e70abfcc9e +:0102901e9e08ca9f6a300637ec8133875336de +:0102a0ed6f740794ef0d10846e078429499eb1 +:0102b0dd202dbfb5951e7ac8fbb98683c92823 +:0102c0e05654f5faf62c1831b954643a6ac0df +:0102d0a5739627517e5ecebbafa37c24cc1681 +:0102e0b9af60f40c983589aad75d454ec6da01 +:0102f069a52eae6278f3df5b6b0573e5c813e4 +:0103004a8c9d098d30f35e8516ab0b6a5572fb +:010310cc081b429acfa423a76bd6f10277229e +:01032021f5bb97b7b3a8a11a044dea9c274255 +:010330830ffbc977a07f27701b6e39c32cbc18 +:010340dd55d17d0bd14bf1fae42196970c3e10 +:010350df7848536fa1b1c2ef52c2dff744eae0 +:0103607bbc9db9c65b3d94bc4ab6197f3ec6d8 +:0103706e1fbb4f767e1aa7687477173c541c90 +:01038039fdcd0fa084632392f6cd0aa17ec230 +:010390fca39766c7c65e2fbccbe3f3f53fa467 +:0103a0a7e093297688b45a7fbe6fc5a10d3f9a +:0103b06b94d944e2c37a617c7a7f52d16c9380 +:0103c08fd5e21c1700a521b38d36cacb25cf53 +:0103d03e4c4293d9e11635d4dcadd3423f782a +:0103e0c1cc523913721a7bd58df44c2db79975 +:0103f08c4302361005b028ecb68ae73ca6ecf7 +:0104009a646809932e39e3aff2a1b617167063 +:0104100673becd26155b7a3c7cb2528a687308 +:0104202bda501f89ea1f9bfa0d66969d2913fa +:01043068b32ff73c65a71b3ed407d73e090d7d +:0104409dcd41c6f9b29754510e3531ff73f6a1 +:0104501c8af5f67dd59f925395feec26486637 +:010460049155e4cd664a96f2d584749df19cfc +:0104708185bd689ad838d44975e7ef3594bbe0 +:0104806959713dc868dd0db93e139400feff11 +:01049055e3be3da2746d596474ab614ab8741e +:0104a073d0a7b6051fa15da08a921a1ea71853 +:0104b0377b43a5bd2fbfb6aa50218d587abac0 +:0104c0fbee911b81252da9dfd92d4cf382f01d +:0104d0fd58dfa9864b5ae229ff2b800af54884 +:0104e0cda2304cc07b5c9525f72334b985f3a4 +:0104f03c4457a3ad2d9057275f819a5a4e6d37 +:010500d1b26bea95ba04ddf5518e58a7e8e96b +:01051081bee3770b28f36125bb901786426dd8 +:010520310e36536a70a88b990df5928bb5dc42 +:0105307066ecc2005ad3e3e29d0a2fd36d420c +:010540cfff3122f8fc774e85965dc5a9a45163 +:01055035de805a5897e821b2c1b434763dceaa +:0105609d9ba10a2be86d4e238503039f4430db +:010570bdf249f8d15674365b7cea8588654748 +:0105805521a99ba0fbdde0f12646f866db9f2f +:010590c5d0d63aee3942a44be4ae6b6b147e01 +:0105a0c3a71d4f1680a0436cf9c97201d3a0bf +:0105b0ae8baff0c62aa5b623c2c242ec404f7b +:0105c09a636729dcc251178cb57a17e579e61c +:0105d02fadf01d14bb9d5fb2d2fe5b08a329f4 +:0105e04e53077683b7caf97f20fcf6b211118b +:0105f06e9280cf00857af8b10fef36d5726c39 +:0106007fbdb5ea52382ff69974a5750eaa4564 +:0106107afeb9f35c60dc1f0a9338c4bf0b90cd +:010620ba5f5f4bd3883c53b4c1a3917e793be1 +:010630101834a2f5684b3749032432205e8419 +:010640d69db54c54e42b96e0ec673b91b42e62 +:01065078c196b4d03e19dbcc0135923f76de7f +:010660036ed161a46e7507def634a9670e8827 +:01067062f55fd4374027c16ac7bcdc583d57d3 +:0106800efe48626322e17ecdf64809ba38f708 +:010690c2c2025fae6f10c1d4599114b0bcb95d +:0106a090deebef1c9266e6bd09503db61fec44 +:0106b0a6004aace03f5070508e847de6b1603b +:0106c03f271cb78f7855d7d1b9cfd704b4856a +:0106d04be24d0bfbc87d7c0c339bd11455838d +:0106e006c0128a5b90d25dbddde1fc49afcf64 +:0106f09ac8378166b4cb95f025e6c5a0c44cf0 +:01070080be95ac59c900510509bc621cd4ac51 +:010710585ce61dc0412922a8ac5382e18154d5 +:010720f034a3db229cabff6fffc54a55611c88 +:0107303fe0d5333e728dca87891cef0d5d3ea5 +:010740529f6816be5014b7a64d9cc4646cac09 +:0107500d29638bec84a675fdd07e00058a48c7 +:010760b47f081efe649faac9a70498b592ac5b +:0107701476107a634e459462d9e6ee75ec6a09 +:01078093624b7df61c1255158a6ca8ae95d47c +:0107908b63d42b699d6f0738d6ec637c87cf12 +:0107a0d0752fa16136c2bd693af62cdd8bfebe +:0107b077e4056104ae3acaff546f63caa185d9 +:0107c01eacbd82070c4fcd27e1ee68475aa6dd +:0107d0ffec73eaa89b7be32ae988d4091f4031 +:0107e0a1d7d9135b1b55c46c5980ee4fb9b3e9 +:0107f02c9dbbe65b29b78d6397b584e55367b6 +:010800c172a2ca56c8acf695b53bbe2989062e +:0108104db7adf161f860818f9aa62e9e56527c +:010820953fa38680b8cf688b661f5f64ef3f3d +:010830ab74905110d023ca86a211f1b90a3864 +:0108406ae27cb87beb4ca1b4b730ffe0fde171 +:01085092bfc6c891fcd3b429328a0ce3e30129 +:01086005f4174f211ea4d3db35887c7dee16f2 +:01087070e04deba6a25e9f1482db7ba554e6eb +:010880ea44bc78ad6972b8f2c0be686f624d14 +:010890535e06754d3fe1270f710d740e3f4ec9 +:0108a09ba11256cea845a87e5effe259b61f2f +:0108b0d53fddb8245eb45808fd4f0f65eb2da9 +:0108c09acd2d1b66020e55aacd0a1e296f3fec +:0108d016a631ad2c08cfe91530e84f875f37fa +:0108e030584c02003f4b65c3ca5d8e4f48c9b0 +:0108f01af123ebe6bb724873740a6473905c55 +:0109001574e6574a7898985ce7ffa143fd949d +:01091015613f2b89514195ac83e78a15f76ba9 +:010920ea1f1a007ee6f408e921122a7a6d6a7e +:010930c227416f58846a607a36ee49938b2254 +:01094005ff02508be1ad6ddaf7947db8788687 +:010950732f26017aa26f848c043f18659c64dd +:010960277881f67dfb16220f99af1cf4bf1e33 +:010970b192ac9216247e15ac2889417eae42c0 +:010980d04ce32b756f0d018c0329737d9ba62b +:010990ac03ea8081058e1e8503ae8d4a584a0f +:0109a0710b1179dae2e4fbbd67a94bf549331f +:0109b01082ca0ab7e71cf6fd0124ad065607a4 +:0109c062e54f0c6f14dde3e2e4087f3457a0b7 +:0109d099a6ff963420b913d1a1458e0b56f8d5 +:0109e00011318b9917e22b85f429b78db811ee +:0109f057796af5f1cfbae17ffdac664398d1e8 +:010a00ae973beab8e4e076d0666930ed170eaa +:010a103730034775dda74602ce2870f2cbc3c6 +:010a205678d53335914e6b7571de7c8cdf4aee +:010a30b8e547eb92f4e265da50592bf9831358 +:010a40e93aabf005a58b6c7bdf3acb9f7536ba +:010a5015e11f2e23b419e7373fb98825041fd7 +:010a60757aba0970bd055d246ccb0640f2aa25 +:010a7012e689ab10e4f76f240ba47ffe816c1b +:010a8049dd85253e7eb6fb1f13959d276d2ee9 +:010a90f1b40068ad6e03c8523bbf8d988b0611 +:010aa0c2d7fb5b262054a673782e12808f3cdd +:010ab0f9f511e8659be7bcf0906c104e29e614 +:010ac041c973e96453008a4bfceebc10e5d405 +:010ad0387d0903da71151b46ca8610cf20967a +:010ae02cb55a95abe9468e1020e1e081d6ee7d +:010af0038a89db807160e7bf5611575569efbb +:010b00414babe3eebbd611df9808d2df5bda92 +:010b103da74255351ba21763d93d1936026b48 +:010b20885a9153065900e9e720dc4f21c8d780 +:010b30847d1e5a0d0ef21ad49a12938a9d668e +:010b40b4a5e8e621a2f2e147d13c853cd19cef +:010b50f14a145db03d5e3a8e0d6829daf102ff +:010b60388f15c3cd241fb20ff96625565e1f73 +:010b70bb22640505440c17726455ff7b5793ef +:010b80cc004e6552895dad28cf17f092224a1d +:010b90c5841d504732e6205bfcf81503090802 +:010ba09b07a95f09401092c5d8cb07d31484a8 +:010bb0e5709e2027fe22200d468ec986d75032 +:010bc0d2f0ffb6399d71f8cbe79229fbdc4cd0 +:010bd0ae3182fe5f7c14de1c57c051ec63ec77 +:010be0ec081520dd550c7a808c2f52ed1821b5 +:010bf072cf0c09a8e4582aba65c7386b553108 +:010c00a3b051fd18f1c5d97207abf3d5e47cdc +:010c109a390a4e343d04c1a948b51293cc291d +:010c20d93be3670852cf978e185351cb11b979 +:010c3076298aca23674952638018d9b1a2826e +:010c4090b202cbb740bf0eab1774f5153f31e3 +:010c50187acba5807af984893532fc280db7ed +:010c60a4e34c866d6f609841898a0a5e5e4a3f +:010c70d559e56676756a7de2cbe0ab2874f3ed +:010c80349ab7f014884e9aef662c6848d37330 +:010c909c2b74e01161277be6074dceff2016d1 +:010ca0a204a10d585b27326e1675a45693e241 +:010cb0842e46633a3aff118e07864358e6581e +:010cc0bf799a16acf4b2b69395f2696fcce664 +:010cd096da19dfa20b6935852cebf8fe86f273 +:010ce07aa5d4fe0be7447bb2ca1309db2876d5 +:010cf0677bd6b528ff5394365abd9a832fde65 +:010d0057777f7b2140be64abecc99632c5a9e6 +:010d10db72f56671159cdaf3ba4a4b59b147ef +:010d204e598f672ea2d93be85525e9c5337dfc +:010d30f793a25f804a063e171d1dfe8a4104fe +:010d4025636c85c88af56d09c18593c2c41dfb +:010d50a826ddaae4ee001d83f9ab83e2bb1ef0 +:010d603967956037b03d78a03f5a7babdaeb9a +:010d70d4bde07bf4fe44706a7e328935820153 +:010d807abc9fadc37a0e4546a4bd5385fd7903 +:010d909043498ef659c931f5a45bc06f7a32b4 +:010da067bb92fa64e1eadfde8342e7522a1508 +:010db09235b49dab3e11e877864811f05a29bf +:010dc0785ff9bd30689e0f12b5106b544a2a3b +:010dd00e7beeccbd8db652fa675152a29592d9 +:010de001ea4659dc19bb773772ec6d05547e62 +:010df0d8778065d550ee57f36c833ada483280 +:010e00ebda37520bf4d14d0daca23520076357 +:010e104cae2305f82c3c0f9d3133e05aa771bd +:010e2035d4307cdd7015cfecc777c296762d33 +:010e300b9de7d4b4946e83d77238b4534ece1f +:010e4047b9da668b06b4a005e9c9d6ba3ccaef +:010e507778b66286f06807d493af7ce870775f +:010e60900de8fb3dbc7f088f7bd8a07915f3d5 +:010e70d08843c161175b69a9d2e3d05840b14d +:010e806025725a4b40cdc6b72deef6775e6b16 +:010e90216633f63d7d86729aaea87420dc31d9 +:010ea09e9b6d0c34f38896c3fbae25c7df5ff2 +:010eb03396e4652bdb1946498853a6ff757e20 +:010ec0584e4de174245ada28cb9664a5328b42 +:010ed03f2cb25fb9b30b0425643eff955fbfd3 +:010ee048a2bf898c690b94a1078a2d7ceafbee +:010ef0ec2c2a7db6e66ad163de97864e87b253 +:010f00cc98a08ba1214e28585ea38a845363be +:010f1090a20ba6a0b5ad42d564f3155b9889d8 +:010f20a00c5c5740cd5c2b2307098b025f935f +:010f30d7f7b8eac5eb604618b9dc2543f3aca5 +:010f404213b06ae6dcb81f7a2d772a47d73662 +:010f5059f431ad49af70dc846281482ede3940 +:010f6091520fd3be7d691a642aa61ec8927344 +:010f70abcb381f0a1a7e1d7f7ef97fa2a679d2 +:010f80adf1c2c2b177df4cc610d6cf86929105 +:010f9098b32f5593053617fd57d6f8764be976 +:010fa09be15b1c36928c458d023c798ba508e1 +:010fb0fc6652a09aafe6e7e76bdf0a57247cf6 +:010fc0490fc4ddd8f9bff3bb52fb9316f9bd5a +:010fd0f1af5dd9f9d40c1f691177571e8bd7d3 +:010fe09dadbe797d6f55abdc2c9c79d13e8b39 +:010ff0e775b611ef8ad6f9ce92e27e64060297 +:011000e01f12406439fd9247eedf498f0507ff +:011010b81fa8c5650d4c6a840d21ee6cbe091f +:011020a2f3d1b54149e7a8571e8e9ff6654da5 +:011030b4546abaec59128a580c88c4597f87d3 +:0110408b2c4c1b1f45a0aa5a3bfdfb462009e1 +:011050e3c7d2794ce13bded1ec6061a1579cd6 +:0110606038b255a88c4e09034de288a3c2b59e +:0110702f5cee2fa10f2065365b6e7d7dab1753 +:0110801f0654bac2e78711833e9279baec86d9 +:011090a72e0ad0614cd42ab74cb0b6885f5424 +:0110a0326aa3d56689f63fe13ad5c3abb859d1 +:0110b094fb8bf501a31b75ea7c3aa4d469c069 +:0110c0f801c065b4d7ccca3d61636746824459 +:0110d029bb50f9ab8a90b9a3b3046d9a60b3de +:0110e054d61a4eb1cc68be2ec9dc62f542a415 +:0110f08592c516e70355dc5a4e1993d50426b4 +:011100e15c60fa5e16dd44c6407ad26e0ecc54 +:011110b92786b07072b4016ef7bc2994ab0743 +:01112025779b3f40f843dba47a78ed9e14e728 +:0111302e57319313c4ab4751637c832d1a38b0 +:011140590ae9ed30aac720bd0b467d42fa93ee +:0111505422c098b4d72e6364fa43d7b08de599 +:01116064b59d28d23df098360158d086ac323f +:011170112c863194265043578f14025ce12fc5 +:0111809aa24e497d3646095ad42f0f3b635bb3 +:01119053734dd833bac968c9f85e2b9447deee +:0111a0ad3daf516f838de97e6896c39cb64a45 +:0111b09cf378961be9093aa99f57e2fce42168 +:0111c0eafb324e21a157a367d76a220ab4447b +:0111d09961381736e748bedae234aed0131d91 +:0111e0eb072ec363d1edf3077519d8436f2e79 +:0111f08f2129b7d212ad75eb699d779602ff03 +:011200a6e520aef9e84be0ad6b2ff0eea1e25c +:0112104c8b06f0a8324ac21b8ce77c651eab1b +:0112201802fecad4e3bec9e76085b22a5b31d9 +:01123077cc34f846c45f30f8f1bcc59a614152 +:01124046b7ea291c0e1c40373b725557dbf931 +:011250e19555b477b392b9ffbbb93676ab5f29 +:01126083edead0014b4b898541f24404693b26 +:011270c2b2764316344598ff5f2570099f56f7 +:011280bc996162347df7f90def0ba8abf25775 +:011290ebe4f1a1778505048dade5c76bfad33c +:0112a04f039a223ddc0038d7945c2b2ca3a555 +:0112b07475cd390bc914aa2b681644d16b6b22 +:0112c01b5f6d929bd63a31ebceac83e090ef55 +:0112d065130afb6f7f2f9635a317d7cc1324a2 +:0112e0a22de8c99b76d00855e268fac59be3f9 +:0112f0c5340e41da5089fcd72527e6a318a0e7 +:011300661cedcd89e890a381408f67673570bf +:0113106f85263100f5bbfdf61f43040ade831f +:01132011ab2518b57a49d31e8f67e53fabdbca +:011330fbc31aee69cd013aef71398f243ce790 +:011340da4ea6e9e60d294663c044a2440fe49d +:0113504deea5b61809b5f98fbfc83acb085653 +:0113604cd2557961b7523bf7e4ca65e8080c02 +:011370e700f0f0411a7d404d3fcaab4260596b +:011380cb8eb593cb79e516ff8780b71f5a9721 +:011390a261f8eebc9d9a34b3f4c47b6caa88dc +:0113a02e6ede69a4d89a03932f2fce91a3c9d1 +:0113b06fc54d446f0ec3c1454574e881877c10 +:0113c0e567425a6fbf50eaf89d25e0d90d5af7 +:0113d08bef97315fa4ac71fd89f7dc9287b6d4 +:0113e09117696797df594138e20d380728acfc +:0113f08a1ad2827698047d7ea1107a00611b3a +:011400912359359ce447a75f879d876a9a0cf5 +:011410c6b1901ea69410e275268635ea4c6e28 +:01142080a061ce6b4e622f13b8b4969dbd13f7 +:0114304c0b17416825399cf37a4107dcbb7ca7 +:01144092ab260a351f84931d6798b82696a87f +:0114502debe568f68af6bd499a8dd6a83c7c63 +:0114601b3a06778d899bc83c5d71ae2975b5e4 +:0114709197bff31947ee32fcd36a2c6d953b97 +:0114807e7169d912bfb625177b419fc00491f9 +:01149052cc1d7a78a864956c3e92f03806be19 +:0114a08cc388502946c8417d793302757c4f17 +:0114b01b20318e07304fa0121172a02b269a0e +:0114c05b94cae836606b52f29134936c4d7b1e +:0114d063ad147419fd3d998f51930007e18a8c +:0114e0876cf92501f13205c66f3ccc0a691a07 +:0114f069a897dcbe413a54505c626b9c05c0e4 +:01150054b3699f53eef1bbe32490178adfc612 +:01151025111b4f0245426b0849a4f79a4346ea +:011520d87e1ed66caa4741ddd0e31d5fb47750 +:011530e850c95edcd4dce0c8a09d3bdbb3f990 +:0115408d37ba6b60a65b67a0526d4ac71a720b +:011550a68d6609e73c96716348586b4b153b21 +:01156022175def399e191451b5126aff882048 +:011570c150ea2be3f5f177f778fb374757bf66 +:011580840327ee9def0cd201edd11bf9c3506e +:011590082cb7a33d9f42b32cba6ad355a08e20 +:0115a049aaeadde2f3c19896c70fa0d5ad19d8 +:0115b0ed4559ea1ae63824c39ce6c8f8305e09 +:0115c0707987098829e68028e453ebbd45c318 +:0115d0bb76b45506e99d41dac9d5e3f02d2ef8 +:0115e0fb7552972981dbe31d3284ddbd81ce3c +:0115f021c700ca1f4d045b30574ba633297fc1 +:0116000107503f97c342654e8656091a203f5b +:011610db97147a2ae9a249d05e94658d537488 +:011620d9be9c9dc713898d36281d4e43db8ecd +:011630dd5e4f09aa9f3bf803a479dbcfe9e712 +:01164086db58b8d18d3283c8b8a9cb8aad921b +:01165085e682cffacebefbb8e5d70e680e19e0 +:011660bc6750c4fe49b165120c61f90c60871c +:0116705ca39b1fdf3c13bde5086e6f3d13c0ae +:0116803f7c491ec1fe68f6735a7fc7388f638c +:011690061133e87eda5fe0ba1fba1e4e93faf4 +:0116a0fbfee238c290fc9a803c8fa211feb0bd +:0116b0e21daf86883cba23dd64b81be91bb0b9 +:0116c091b61fbf64ec11602546f3fc4f9133b2 +:0116d07be52ce931eae62514671e604f5d0800 +:0116e08ca5c045b848bf86b6e1b6f2ad8156d5 +:0116f031bfb96a6351a97d09fbd1fbc26c26a9 +:0117000d5702ae992afc413d2073d4aab88941 +:011710c5fde51c00431b9b2a82fcd964a572a5 +:01172014bd6109c9303a1461c1e9b1220d4572 +:0117303bdb3edef376d7088fefd42d6753b8d5 +:011740105e81bd2e44e8ff09abdb4aba8cb0aa +:011750e2780d79838a0a22a72c77c891d4a202 +:01176010d66b4f2d11b75c23fe3500bb28ebf7 +:011770606dabbeb1a1ab5e431e7f8a3fac78f0 +:0117804c5cb8db1d5cf095127ace6f2000d861 +:011790f45e89d03e9eace5d2b69984432dc6f0 +:0117a0891e0b927b82a46ce9d0e0e8807e0015 +:0117b0c1b503c6be52da152f1913d5770e6802 +:0117c0ef10ee0feadf3f651b2d72bcced767ba +:0117d0b0709e27d2e8e1523f45895e9737b41e +:0117e0621166b1e480ba143c8f43abd1af7cf8 +:0117f064731758fb32199f2007d21be62ef7ab +:0118008af8c70d1618d5b33762e2dba9450bd3 +:0118102074dfe45a755324a764e3931686fe6d +:011820f0a2238179bbb15bda160a7e4fcdaf0f +:0118308f3b371329fda931688fab270362f086 +:011840fa859424d6b38155607b9a2f9045bb99 +:011850c3eb7216f5f9195317cb2caac8687f81 +:01186028697774bf3360385c910d6829bd49e1 +:011870fcff653ad29e9d42de3f78e3a5ca0325 +:011880993de7a1a16c2641b520f944f518d307 +:01189048960349527a9295dceac47011e8972a +:0118a0cfffab9cbe8973ea4a977d1edd95d8e5 +:0118b0ab9bbb3f1616aa259883c88fae2d40e3 +:0118c0962b7cf8643da487e6eaf92b83a53157 +:0118d01697753b9d7dde445adb51b7e4d27887 +:0118e0eb10e2fc0d2aabbb965bf503e03e04b9 +:0118f0416d892779651c097764d42545fac958 +:011900d99ed8b5775c2c3a3fe33f2c700db75d +:011910b61bbb47ab0656fe30a082b97fd7d525 +:011920dbca79f5b6aa88fdd4ebfb5950c19512 +:011930ef72dd677231525b3d4101261d42654e +:0119407136d3bcb80da473498307ba177bd93d +:011950be3124265798b1892e8ab3031087c521 +:0119607f6577e2c8191ba0366e839a9978140c +:011970a82c3f9783b5e66e8b148420b99e0390 +:0119804daf4fc234f06f8200091d682ae5e82b +:0119901936690e0843c9beb5134cb70b493982 +:0119a0badaeb83e74834c6ca98195bd44a06b4 +:0119b0fae3d6156b8ba0b155d9551df2816d71 +:0119c05cb6052ad0a6757dbd71b21d187b2c71 +:0119d0b48c9a75cbc88172fb5dcb2662dd058f +:0119e0fed4831503191b19fcdfc1d77d413fcb +:0119f05c5e9803b1d6aa4e0cd21a7be62ca421 +:011a000777a8e45df4df52302ddba2f2990786 +:011a10b2ad79d521092e012bc10ce7571ab0b5 +:011a2052ff6d06d0819277f69cea034e363354 +:011a30cdaee00b76c0a5687e4d99ceb8cc9541 +:011a4003c9005d6aad5934cd2e6503af8dcbc9 +:011a50ad4738e1edbd0c4eeaa32939d19cca9e +:011a60cdc4d02458e11437ae4f12f471946401 +:011a70512583d49859d906c5a58ae31e735a57 +:011a8075acda2f9487988bc70803391f9184b1 +:011a903f6817b969f7baba5bec806a6a86aa5c +:011aa05fa597b914d217a779b189a72239a2c2 +:011ab0447195c524d028a4e013b6393871e843 +:011ac0a8bce07828c422eb69e63684bd62f6e4 +:011ad007a3c20ab891b775a1f40910e916a1b6 +:011ae07308d5fd39c390ba871eddc99ede60d9 +:011af07f8688b34b32becf945083c4cf73641a +:011b00014b499fc95d88bf8a0de08dc40d730b +:011b10e787ac4860fd1ad5c6f2a506a284cd52 +:011b20c3a21ba3b2ef0a225789f359c6b1e104 +:011b3090fa3671bfe1f992c0e8fe27b53407ec +:011b4067a7c9ab72ed6d56815e96803cd7102e +:011b50a39fccb86b4d7baadc25475d836b8209 +:011b60b883602da3f89e56b9fee9b357f0a42c +:011b70952184ad488e06ed32b07dd846a97209 +:011b8024fabf1308e1b89189d574e7bb1208e2 +:011b90c33890afda4dca5f10645a7ad7c5d11d +:011ba0748708d410088d4832e23181636a8221 +:011bb04ea8093288579bd3fdd1ca9cc75f9b13 +:011bc0797c6beb1bf2ffe3f105967f9cc4ebc9 +:011bd08aa3794799982c0d6a376f1506b692cc +:011be0a971e2896bd58fc6c254765d4e2a0487 +:011bf0c513ec06f157aa97da03f4b8ddc24027 +:011c00b5eaf0010fc4019e3d538072965dbbb1 +:011c10148af699c4cb33d55701634d69683a12 +:011c204ee161d4e0ea811678a4ddedd7ac818b +:011c30a43c46605d341fd1b58959d63d8310f1 +:011c40d3b0e1fa96a955865363726d8fb35ecc +:011c501ceb76dd273345510e159d8d2b778d89 +:011c60dddd5c2c57eed2ec080acdf914b9d25b +:011c70ed92ed9c7d1e285ea82f07e31f8565c1 +:011c80d48044e84da5d08785c6725ff82e0b9b +:011c901c4b69cbdce0b074165cd82befb85f20 +:011ca0e85e802959936d32b2ba6f6cce24ba71 +:011cb08aae008ac18e5c71af813d3c83d41f48 +:011cc0dcdcc6266abd6c5e06107a411cb89388 +:011cd0857b3ab058432c35828ac46ec31305c0 +:011ce06cc5907358c41fa4a2e1373281ae70a5 +:011cf0c0f9b48ccc09a6df5dbfdae5af87b3a5 +:011d002018b4aaaf50ae5cd2021ff9b4070257 +:011d10a27b4d0f4d7e173da8b7e7210da4185b +:011d20c58a797f3ab14baa0770ea937dbcaf7d +:011d300bf21fdaf0da05ccf84d54ff12cf3a36 +:011d40442259e300e893c9add9a986e39cc77e +:011d5040a0f46459aafe77b84dbd8e19e63f33 +:011d60feb9b79ad64585174d5758f4812a68be +:011d707f5ff6386e75c01eceb5e96ee8e53e7b +:011d80bdf3f4f87b220a9dc3b7871774f57c6e +:011d90bb3ebdbcd7bbe9595462fc840dfed57b +:011da0448ff602d08b958df6679618b64c1ce4 +:011db0fec6e1e973237d5dc60f97122f9eddc2 +:011dc0fe92ffc7a96246319d2854bc26700baf +:011dd0870386cf01d9b36d15b6c2d247cfc9d7 +:011de0fe8f099cc6ace15955461dc9c73d5bfe +:011df00282ddbf3e421e5753d6c87cad629261 +:011e009bcf7a59b1f36b07c40d105d68a457e8 +:011e105caa4c0c073de5340da828ffe3913db0 +:011e20d8aa7e8b8395e52fee5c71267a186558 +:011e30377d12a7a5817db6d74af7f5a803ea11 +:011e40c7e693fbe1aef0614fff317cd441a3a1 +:011e50d7e418854d23777ee40df52888a2007a +:011e6086803baffd4a033e91be02c9dda1a712 +:011e70e15f132fc23d5077b892fa91f300f665 +:011e80e815041221be67ad8cc5bc01d209e9a0 +:011e90d927801de679fd0db3144bc341047b98 +:011ea099d0c0242056ac3938caafacddc180d2 +:011eb0cb97b2489c134676087da2ace9d934b1 +:011ec0c679fad5abdaba97a3833fea983f7f4e +:011ed08835e9927f594ad5e69d698ab2e14a54 +:011ee014adc075afe0e676269c8764c5815f6f +:011ef0a85bf6b6aad5e38a4f95a5f1ea6ecd41 +:011f0042856dfc9df9570ff613e0895ed13480 +:011f104429f7fc9b84b3a7aec8fced00870164 +:011f203ab1c3350cc590eca8ff962cba376000 +:011f30dcdfd6d8db40dad9e6acd7900ee0d8a0 +:011f40e1a7b4ff56201bedc4e057c066e00618 +:011f508d0a7cb7b748074e709e69760d2c47cc +:011f609305040e5ddf04d02fe9819285e2ea59 +:011f7099315b915fae33edb005a1bdc8f45844 +:011f80d3473d1b8bfeeed902f633584cf81d74 +:011f90f21307c95782f56490187d69066209a3 +:011fa0ac7295ba67f346b0a887a68a1d6441d7 +:011fb0edc14b10f88abb1826f6e78c33da705c +:011fc0a9c4bc4994b9e1f321945e6ea8a7a6d4 +:011fd0e3740b41a509a2a62e6fe31fca2c2c7d +:011fe03e999b2002f18e182f5a0987178038ea +:011ff09f5b31a00b8a4fb7aefd2462371dcdab +:0120005a659183bb1953d0eb5265141610e28e +:012010a7e2274a7e9cbd39aeb1c4af7f6152f2 +:012020d7ee4ff882923f0d8c8d0c645d85cf48 +:0120306b36076ee42d2ef3dbf177ce90c445e9 +:01204020e09ee3c8187a3b6904d087fd8f7627 +:0120508894da9fbed0b5bc4fb4bd243e9f7894 +:01206023011e459727c6941d3e54f4247b2fbe +:012070827e5936048f88d6e2d7289d0a0a70cb +:01208029baaec8649daaa990d61cf709e9a85f +:0120900a01d5ddb613d8d90fba97eea65f8a2f +:0120a0062d74fe99d2c190b3acd5b39248a467 +:0120b09ee0c5c6aa6b35af58ae5de0379d4617 +:0120c0800b963dfdd7ca9787c6042df621d48e +:0120d075802ec8359e448e0f76a81cf5f642c4 +:0120e0a8e188fdac1b49491effbc555800bef7 +:0120f0e6448f0d05e8aad6c3cc3fd530b5720b +:012100c8508470609f7b16fe9fe213ab3a7e1c +:012110a0ad5b0ea05f5cc9a5ecaa58bdfeb023 +:0121202fa0229b595434f546d5fb345feabdfa +:012130040769d55c3adafbf9ae1a21ee0aa45a +:012140f5ab04148e899453dd37fbda43276c53 +:012150f16bf54fae1aa94f0561391939b2b515 +:0121603d0e40b1b97b418afd475731244237c7 +:0121708cb506ec4f1c848348e02726880099af +:01218066661ea739771c4547e2783f329086b7 +:0121905a1f50711826b300d681f36dd17ca965 +:0121a020e3f41581889aa2f45a18576a9d1c90 +:0121b0dbf22b8017e41cd7206f643991fa3fbe +:0121c02340937011bd3c83e2ccad9701a214a2 +:0121d07a75e10828a22b160387f6bc7081c726 +:0121e08ba768f094c41b0dd1df9e987a9adbf6 +:0121f0062150d76e96342682bce38c3186029f +:01220098f2333d3a7bb80d27d7be64a16eab9f +:012210c89797d9d305e3495d63005c104ec2dc +:0122208f0f281d5904737b75147bb0e0eac007 +:01223089a0109a6be3cb948410d3aa4f9d5f5a +:0122406d031179f1ebf5dacb2fcf8a0850662a +:012250b5742c0b63c34406b327737c47d617c3 +:012260cfa68284257faec236f3c44126eb9728 +:012270af908776249bce9823c5b19aecc8e870 +:01228043dc1637446be099108fefb81f572e56 +:012290817678c9a6c109ae9abed8013cf9f443 +:0122a01eaefdf0952ff66df3ddcd76b014940e +:0122b07db8d46c38ef79131842380557f79e7c +:0122c0db8e959e2330bb8b7e86fe3240d42efc +:0122d0e37e55cb0a78ec61d419d66bf00c2cff +:0122e058ae9dd69cfba8b950b5f1faacdb38eb +:0122f036091ba3e473d735f62afb3935bdf384 +:01230033e0b4df7c9355e161128fb333aa6c1a +:012310e5b105d1282dcda2dc3de19a483ec112 +:0123201f94de82133e50b88f07e01c7c9af1b6 +:0123307d6b8b269f5cd71905f6d022c0990248 +:0123404322442697695e36deb6c21aae32892e +:0123501765b29203ca5be33188d305e88c3dfc +:012360f121670d1755bca20acdc79e85cb6cbf +:012370338fd3c885751adabd40cadaa374269c +:01238093e0692ae0d3eb61f17d3ed8badb41f5 +:012390595538b49c62d89ced092e57871c8d27 +:0123a0e3e7c49d2b3553c8bd6cfb70f290dcbe +:0123b03def5e8c87b3cb4eb262e6aed0647702 +:0123c06f18d4815a2ccc6aa9fc21254dea1000 +:0123d0e71088939eb657537f30c135dbb474ac +:0123e055c3dc507b96bbb09594d68097bd2a57 +:0123f05b45f4c9e430832615380099827d875b +:012400b6daa7069e136058f5393674a220beda +:012410323f51d573b7c761081e38cfe9d56316 +:01242020d47c5a195facf518c7ed1bf7bb31b1 +:012430216ab607e09ed782a878cc98b6e77c3d +:0124406385628f5f5e31353f4b617a5a02aa14 +:012450b170058b0e7c1b7da7406cfae3d2562a +:012460d8932b25a3db6402ef4d1e9a782428ea +:012470153db16d7903f35bbb62bd2e40852a9d +:0124800a007fdc41e981ecffcb848d26da005c +:01249091913be6a41b2dbb78c3b83d770f567f +:0124a000947e811376ea1ad3194ab33ef551e6 +:0124b0cd348e0660273dc6ec57f6ee278152a6 +:0124c020f4a356a1b94baea89e86217584b5ea +:0124d079c8575866b09359d6c3b760509f2902 +:0124e09f747b6ea372cbfe2d5150cd92131c40 +:0124f0ffb0ed976d60862404725ebe780c0f42 +:01250019bd8865895331b9835e9e4358d787c1 +:01251072bc36e0cfc1d88675836dae03bdd195 +:012520a5ade25604d89a675f31620da4163798 +:01253058c9c9fb22e94e90be0171d92f51e0a8 +:01254087ca106283fa06e1bbcb76c393c972f0 +:01255005615af3e55cb96a901fecc3ea1e8e0e +:0125600274f01c9876d5e13d8418c6fbe2c8e8 +:0125705839409642d87a5be8540a36d14d0563 +:012580186ff1e2af0ff9a2ed3c9e654794e385 +:012590f352b8d374b3bb092da9c5d6cc90961f +:0125a00ddb327056580fbc929a8e42de2ba63d +:0125b0c9d773f774a1f50d6f1641e7f921925b +:0125c0130f763d5895bf4dea38ad2903415794 +:0125d0b16f20658caa2b78b95f9b9ac49b75ae +:0125e0c10df1aa8bbeed0a41f1029acaa32473 +:0125f03eb059dfd80ea9a8e9638277ba8c48ab +:012600adeac620ab4d30876b6cc3240c8f7d57 +:012610c0f3e8adfeb8cbfab58b5513ab896e4e +:012620ae790547ef81bb5d0ecc054021654d80 +:01263062354a0b4eabab41f11f035b68486c5c +:0126408065d8ef87383e1c1092fe83a9df83da +:0126501c5008393561e7afeb905b2dc5236ee7 +:012660415b3c39f5d6f6f940fdf12f60b729d8 +:0126700fd03f907e59dd4f22533ef1a8105909 +:0126803dae557a70c773a0bf531cef5a243c6d +:012690cd92213e6e021d867aea5a668a33b1af +:0126a0094726f6abefb3f791478e1119d77f94 +:0126b05222dcecce17a405dc3ce5c4bb7e006d +:0126c06f3ea086e8d4a75d4e555a41fa7140a4 +:0126d00dd3a679e5b10185170ea58700d25bf8 +:0126e0cb10e7c646f3eb46dfa14c7df79058b1 +:0126f090d7e08219d133399a907930c93a73da +:0127002973cfe2796bec84e78e60e0c720f227 +:0127101b73a6b498d8c8f061c9553c9eb04fc2 +:012720dd631e683cddbefefd343577f90f897e +:012730bb3100e8ad196be28ff265bfac3c153c +:012740f49106065eaa5500fa3d78946b6610ab +:01275010853aeafff00510c058bd280caa1853 +:012760f681d8593662d9daa1266778b634a12f +:0127706205d9164f7a49f8c84927ac419df1a4 +:0127804296334b5042c35da2d4744caa4244e3 +:0127900bd3e4bbe250fd8028c0cfe8a62005ba +:0127a060495bb7b4f65927780fb86901cb313f +:0127b0449e9fac67e0cac8745c1a0b276b819b +:0127c052fa35c87a571ec54d4489791a90b1e6 +:0127d0b12ffe7a8d82888952cad4e502ba6c1b +:0127e006294ccb5e7c73f193061e1804038604 +:0127f01f84812e71577e0f79afb05bc818c994 +:012800dc93b037a964cb29b675d25783b8d2a1 +:01281041111bda3c8149bf263720e6addfe262 +:012820d44a116619fe5e60aeffb98ea22e181c +:012830c8fdd0a064bd05242ddcbd646ea82417 +:0128403b016108f3fd361276e84898fcfadbac +:01285019b6135de28442a3e37731859f5980cb +:012860ba34a80d158467baeb491d2c9447e24f +:01287043f86cf9663c53b934611789da5c79d3 +:0128800dc8f81ad0505697290bedfd5a0d95cf +:0128903dfc772e5dd8ce2554410d09145ca045 +:0128a01a1b937a889f4ad27fc14d020f71026f +:0128b0bfa51d8046a8ef6abd00fd484dae936a +:0128c09ff88bb20ad110b810fc7501d502a258 +:0128d0b21dcdbb706a9ba168e2f149b7673d53 +:0128e049465824c0d9eecc50cf4e95e6d293cb +:0128f08043a0b452b6199df9dafe553b34b79b +:012900f30aa3b6a03d897bcd9b40cf47294b0c +:012910ce612a56da61bf7f7318234b4051b954 +:0129208a286b1054daeab04eb9681f8f4ca12f +:012930c0884f9b7dc465a1950dd2e924ccb2b7 +:0129406360df042ab0183aed360d74b083da91 +:012950d3e74dbea4a0299a7b2503eeeb6a04c3 +:0129600210cea9a4599c566c1aa97d6e74969c +:012970520db816357893c9d9f8443e8ab309d6 +:0129809b60956dcb3f3e4db50eaa2bcb7db25d +:012990d9c6254fa8aa63fc3b3a665c75940033 +:0129a076e136a351a2e53fb262b0db6dc8bafd +:0129b05861a57139d8ae0f3cf970fb5dd70a9a +:0129c0d5096d8d84e1d6cd3a302e225367ce76 +:0129d0609ceb6cac3e4fea0ae26125e92cddf6 +:0129e01964954d0cee6cb5c59e59d7dba8d06e +:0129f0d64789d325eb1da49c84ca2479b85c5a +:012a00306a7618a75cd7fac1b54ebf8025c043 +:012a10f2e04401d1dc816a10e44dfd3d0e0915 +:012a2034063adb6c079d9fca54c7cd5d20ac8f +:012a30d71982d4179440598e9b68c90842aed1 +:012a400db7b3339d92e39bd9a08ce72509a77b +:012a50496af715e0035de7baad6bf76aaa1a80 +:012a609ffc6aed507dd6738baf611c9033f3fc +:012a700162b063400fa7ae27f58c97d28a1bf2 +:012a80bef095419dc44868d5257b6350574cac +:012a90b00d887cceefe90fb651fbf1d40ed72b +:012aa0963b1ee9bbda7b821ff58fd5acdefb8b +:012ab046a2f6a8a9cedb84b21fe03a4b2f58de +:012ac0e01ad5802e048d5dad34d97282b5bd58 +:012ad0acc725c856a05bb71ed882b6c17d34fd +:012ae0c07965d00dcf683b3195edbb9d890f4c +:012af018476763260b11f7f389779b47cd4ac4 +:012b00ada23f984355e078574a978dcab3d324 +:012b10eb677eaf748b2238f466d63dbc4defc3 +:012b20db4d4aeefd5f7e0527455205265ea9d8 +:012b301bba417cd5ef7a11c5e702578a8e92ec +:012b40bab58d8ed53d4b5e70067bcce8258d86 +:012b50914509807e4fb21c50c1a9df938e8205 +:012b605c306eca4f97ac34bf1bd91fa72a3919 +:012b705c602912e37e0d64cee0a13802f3868d +:012b80fce0af43b1c8af552104d54d383759ef +:012b909ca7adee8a8992feab8567e592262b2e +:012ba0c3c61daca7df070eea8549663b8c022a +:012bb076a0eae56c8b8360512d4f0c49b0cb92 +:012bc0e1fb8b1d31bf03e4a5074ea2edaa30ca +:012bd05f21f2054ae67bf61538061b6f2c1944 +:012be07aa9834edf4d3f2e3ea882293fac20d5 +:012bf0f8d813fc5d5e92ebe320bd4f291d7b00 +:012c00a30255a6cdbd5c262d7f44ceab13579f +:012c10322f31ce18d1afba73cf8c3e329f6b65 +:012c200f769934dc84001efbf652f8acac0fd8 +:012c30d1aff8715d30c45be5e9abd646b159b6 +:012c404cd9b55118b7ab1923ccd1048d7935da +:012c5021216b95b19228767ace6f60e262bd8b +:012c6077ea4fc8039657221801943e4cd319ad +:012c709e4561a864842a0f317a204eb985a875 +:012c8038091ac9a0685b303356664bf16a205a +:012c908610c19cd746db8befe6cbc14e1c64aa +:012ca0db072d6a67519474b3fd925ef4b62a3d +:012cb0c5e94563428b6a166048c902c43c2bbb +:012cc077cc698de8b3584214af53edae835612 +:012cd0e3ff5c7a09187086905b8c422357e86c +:012ce039bf1c9cfc3c2c4673eee22e6b1aec43 +:012cf0979c3c6bd47a32350acc4dd7a6260710 +:012d0023e616521721afb0b57596d9dca80d32 +:012d101406c1d8f64a20be24e66c28f380a7bd +:012d20d15415519f7b03eecd971dcab7bf585d +:012d30353c7090b8d0a1e7ebebdf01a2bd2536 +:012d40c50082bb193719a6854028fffe65671f +:012d50861d931998d577f0bd08237276f57866 +:012d60f93535d8657e5b677e82869ee1631992 +:012d708ce97d9a98b2aa07c1f5889b3ea0dcd9 +:012d80be9bce096041bc98ee9193d013f1609c +:012d907f0cfb87e652ed10788bf59958a55365 +:012da08e4082d222240a23808488943b10d2f5 +:012db01d31d05cebc01e726c7a24ed2bb45479 +:012dc00ee4ba466813bd20d23289a18a60fab8 +:012dd0cae4848f9bfd1e8f56c313124f3fadca +:012de0cdbe1357983f5a6aea505e8c2e323cfe +:012df07283a45c4855ba45d0a9818206d50b7c +:012e0053dea69d0a5c74ae3729ca830bd4654d +:012e105ce23f2a275643b8e97ada0d8563c837 +:012e204e5d548304edd42249a57d36ce5a3778 +:012e309af3004be391995a97ad9f2cc2a9af4c +:012e400c0abd085362ba1fed625b607d1949b7 +:012e50f945382d9a9f9b961814847961fae33a +:012e60fa59dcfa4c2ffb98ae61357d4eea826c +:012e705a9cf228f6952b6e6f4edea81db3b1c3 +:012e8037b7b7e4ef58eb9f20f42451274d5dbe +:012e90917acc4f7766a9774700bd0cfa2df9a3 +:012ea003785fcf3c696de21b02d43bc9e279e9 +:012eb02c7a3382365400a79df97aea97f2c44e +:012ec0fbdee35ebb6a9a6db09faec138d57ef1 +:012ed02ae39938ddfdb93997d9a3df5f68b383 +:012ee04e0b4e2ceaddc0f019d2d93eed769273 +:012ef0f74604e36f7dec66b6b78a753d4e75fe +:012f00ca541b568d0e2d3be5d4d5f315afb2ba +:012f1066a780ef2357f672adbb72e0f9a7de2b +:012f205787184f58e5fdd2e9e086017e0ae9d3 +:012f303464512119ce7b9d68cb75474c55aa71 +:012f4081453747879cfdab990b1c34ab4dc7de +:012f50459588411b4d4fc8960b460cb0ee25fb +:012f60bbc070cba7ed6c2c85fe156c153b0fe7 +:012f70029b4768e9d9d63e7e2ab4b352b3ce13 +:012f80042653c0ca60e6d778ed33ce4ea30e5e +:012f909977abcc68453d4bfd73dbdbea08b8b3 +:012fa075d6495ea84a8b8bbd61bad627d96d63 +:012fb005f06ff73d3ebfee344f7c7b2e2c1571 +:012fc0118ed2a11f4add9e904bb80a433baace +:012fd007e983992d796fecbdb50c436c5e0bd6 +:012fe0eeb96ffd80f277cf48332b5b1717cc22 +:012ff084da5a260e9c4b9e61b69f0b1ab905b4 +:013000069a001bdf811d0f79d2b905178f1f5c +:0130105ac286ad9ebd0fca2ad2475e44995d7a +:01302059e61ff89341cf3ce1150db55d48e3bd +:0130306e7c2c11884918020a3a28953e2383b3 +:01304003cfa51a53e373f950252063f2b25507 +:013050bc2b34c107926c9d2d56ddfd7a3eb365 +:013060bb70b17961de61bc2f0ecec94afb19d3 +:01307082643a44f871a1aec0e70c6117fdcf1d +:0130802c935f2cc2ef17de4dfcb88d72bf6799 +:013090a4a502b378fe31c2521d0aa5276632bc +:0130a06edbb318fe1cc7391a10033659adfa24 +:0130b0e476c455dce02667f229db24394c534a +:0130c09408495bd198c80d70de966ce43ffaa7 +:0130d0d81ed00e86314e87a9b68e1ca493ef4d +:0130e02aef9ac2834b6953f4a784a3fb8e9da2 +:0130f0dd6886fa55fe7278cb8ecef1d2e917eb +:0131004dcc41d71500198f97a546af5c142343 +:013110e84d94b7fa8765c0dd02d6f5397736a8 +:013120d3253af1537927896d09ddce75a28fcb +:0131306ccd2b5aef45838d806a03e694cde138 +:013140b6370c1231e47bf483003fcaaa9179cb +:013150d81e97e9483c1f75a4151227d7d578b8 +:013160f60dafd7fb99b6b5b1873767a74fbde4 +:0131702162ad87c44e54e52e6624f03e37bc54 +:0131803475dc43fe522f336a31e1918363bb9e +:013190e63f43ad64170386a622fa5d3fa97163 +:0131a0a50df76a08b1ce1a7eff0201a955f2e7 +:0131b0c073b7ae1db16473e75babf630bc61d2 +:0131c00d544e5eed2ae7fb5f1de0e092898553 +:0131d018c9c94b39f00a5a1b60c862f0678d5a +:0131e05f0e7c5f1074f538e9678b3421aa466b +:0131f054b564478ed4ee75c114c5b47853e509 +:013200dd664d3890ad49b3653737810cb2863a +:0132107d5f2c504a2dbaaffb56335531a63fbd +:0132208c3ebd7821a4c2dcb06bd9a26e86110a +:01323076f0a7fea4bf5213927962f4587e91c0 +:0132402a2b14ea4d5167e3f13e8b5493a25d7f +:013250d6ed4ec6726b2e1218f31b7b3c8a7269 +:0132608a8552c1a590eb0a1bf2f3ed778d1fe7 +:01327091300d6d444d27cdabab67908fc265de +:0132807c63a0ff407b6546af91bd32ddecd55e +:013290b5f976d1f02660e2538003fbc8fda200 +:0132a0264dc5207feca7ae7aba977d74df153c +:0132b057f429e695cf4f45ef3f97185764137a +:0132c0b0063c89df51d16ee638cf96f715f67f +:0132d00e85354b9409b37f7060ca6e2b0093eb +:0132e084fd37638d20dd8fa7fb197bdcd8d668 +:0132f0848309813c2791d7cd61851b0901ee7e +:013300dbe2a707a3bef1aafc7a93e163b03395 +:013310f51a99485e7745068687241663a992c9 +:0133207c420883900af475d5dd584a934159d6 +:013330fb0113b057662a32ba26cf7751492624 +:0133409f505c08a55af68a063fd0e8a3150a8b +:0133502da9cf319654a857971bf42992ba169b +:013360ae6bfe2384a3daa359b44e908d3b18eb +:013370e32a1c219ebfeeb18d82664213e821b9 +:013380c323b29113a3a9dc2a7cfbc68a371065 +:013390777195f14557f5dc41034b66ae7f9170 +:0133a07859e0d4504aae5983d256654544df48 +:0133b0111b4d6d37721af046e27ce6dae7c492 +:0133c0798d00c0f4c77cabd34a94384ff9cd37 +:0133d0fb386585f247407446ee86a5eb117923 +:0133e0356fa44471d2e2b811855c8645ff8cac +:0133f0ed3abf29de283252ce02abd501302150 +:013400a9b6d610084052fe3fb39d1003884052 +:0134105ce17226c71e0656ae96bb59ea1c5723 +:01342036580773a35e85c205988e3b03e3cf33 +:013430a38426eaedb0729b44ae362170914021 +:013440988259c04b0d83885f96a475e65c3122 +:0134509368e6764525d28e121d14ce639828c5 +:0134600f6d4a975caff5dd9f25cbb869e0ab6b +:0134706848c75298600aa43858176280adbc3b +:013480f0ba3e221d45694d44e9e4b5acd2d164 +:013490529146eb05a034128bb02404d605a4ed +:0134a0cba337f3a02f65f7c701142bbb9721e5 +:0134b0e75d49781abf12c9d92c2ae1cc465325 +:0134c056869a882530b14f59350accbba5ccbf +:0134d048b7b5077d0f1cbba69a9a8eb73fa62f +:0134e02b34d47066ade119439d5a9c28ea8864 +:0134f051904b32bd96faf6f2b51190e10effd9 +:01350035a60707e7b22f347cbfe8832e91f153 +:0135105c33fea2a4dd0c42fcc0eb3dcf2b61f9 +:0135209b0473e9237fffcbd9cf59c89521df58 +:0135306fccf6880915208cfe4675c53f271168 +:013540a049d4bbbc0d0d8ac1027d32a3c56b9f +:0135502feb2c09ace4130052a5f88dcaedfecf +:0135607b747b49b83d608fb07623101920abd4 +:013570f9e56bfbbbb849c77e5c9fd4cf801bd3 +:013580428cf9a3f1734c0991d9966256351b5e +:01359081188b9fbb8241db572b0bd2ae3a9e6f +:0135a08c2dbcde8b35781e5538439d3c5d96fd +:0135b0b1a5e948480b648e97652a4b32e0fe32 +:0135c0b7d39e821e19219f670c5ab4ee54aec1 +:0135d0ab9d075e260f49370171cd1c226230e2 +:0135e069c9dcab3fd0cfb5ce1fa2cbb77cee24 +:0135f0c57206c47ed97969bc9d66a683386347 +:01360065f12ad28516ef1bc465b8b59a35f010 +:013610957aa8b1590a9255fce6ab72ebedc41f +:01362094a7000464894640032056cb0fe64cd6 +:013630b92e28a54597ffd4f1b15f508d325359 +:013640d17169c122f02d2fef51e5e2839928c0 +:013650c4a92f1ed2dd3f006136576d21b4f284 +:0136602a083733cc9ad144c216d5927fa6796e +:0136707d1953fb0b97a44590c3ed3040615aaf +:0136805316220652ab6e2e28c0d5720113dfc4 +:013690a349ac7cd27340e2eb9db3e51cf662cd +:0136a01997fda4b6d0ec9f97d968f291a627ed +:0136b0a80fa9ec2d23f84faa72a9a14ed43c8e +:0136c07245ab953cd721403b514d1248109977 +:0136d0cd152a02e1cf215e567f16e57bdcf3fe +:0136e0b05ce4c46aebd1950b4db1319f1324c3 +:0136f0434ca436bbe705122777a8e8facbd584 +:01370046334acb1088412cdf170e9b92794d95 +:013710d3f1926ebce3f41c42cd922ecb38a078 +:0137204ec9be093330dded671855cff4c1f950 +:0137306079c92a3313c4bed0b29797d7a57502 +:013740c58238c9ec8600efd455bfeb91542f3f +:013750eb51aa8d06b69885ff7881d57396f769 +:013760502de634576c401cfd8d8019df89f9bb +:0137702da495ebbd960920fba328a62a8e4454 +:013780da74c4c0678637156d29fff3bee43f39 +:0137909ff6471709d0753a73b9013a68567f1c +:0137a032acd0d787a3e8a9a0de0f9eaf77ad85 +:0137b0267f59f237ad8f7b5528c2b92f8d9e21 +:0137c0abf76c4a6155b25c63fbb5ac63fb0c54 +:0137d0acca1c7210bb49d7b64a133b727f1c2d +:0137e03d109669d05408d4bc9e1cc7970c0b1b +:0137f021e63b9527240bd08c1bb045f9eeb43d +:0138000080fa43bef3bb34d6b5a886ca50eebe +:013810681d0517bfedee4ad897b8cf40145add +:013820711cdf3dc3aa08847b0c6c16efd52176 +:013830e1f2b0ba688d26656c9fa16cca3bbf65 +:013840af188e14711ddce86d2dff962e72c7b3 +:013850fbdc7cd4b62f129e79e32865d9d90b67 +:0138606a634380ee3da58fb824fe700254f69d +:0138703b9f6787f88f77eac242c07043dcaaa4 +:0138805129c70e827c81b12ca3709176fbea99 +:013890b266cc5aca1928b21f3685f06fbe0b3f +:0138a05ae2a2f22974c741dc0445e2c9a6e25a +:0138b0a09b6ee9200513914d915e27de1304e5 +:0138c0d42eb101a581d9e3c70d05fb2abf2f9e +:0138d0adbb1b242ba17178e6b0381fdecc1396 +:0138e008aebe85056e6c067c5412add1f3fedf +:0138f00f69a01d4db0514effdd62018f4a9b8e +:01390058da6d145e5cbd440a30f13442ac630a +:01391004c38f3c4d9087a95092681a18a957d9 +:0139202fca689033fb6a75799c711d63d279d6 +:013930a3f44ecb65b5f61ca31ac402fc668cd0 +:013940b698bc479a5e534b852acabd7c234c04 +:0139507b9002e26dd3b30d4454fe0b2e5bc11f +:01396096bf8db40b8a7cb5fc32f79dff7fdfef +:0139702d9a12581f00d4e86d62d2dea8b8a700 +:013980fc0b707e5ad62681ccbf3c25e3aefd83 +:01399034674d2c564f02239e46612c0281d6ce +:0139a00779d5cc93fe3eae88375a2f70512ae5 +:0139b08ba703a4c55aaabeff841acc2345a36a +:0139c0a5569487dec0448c73a2f211d2030cec +:0139d09286e4ee76faf0a6d5d495f17d58698b +:0139e01351c9e39c796552b0cbf9b2e8929d33 +:0139f027fdd297d1ab331e0bffff6e01c71c31 +:013a00e8e38cc66117df880b519445672d419d +:013a101058a0669e948ad0780a0de33bee25dc +:013a207b3abf8929e17d11930025142775f040 +:013a302a9881098deaad030f1386fde980cd8c +:013a40ae35d4687de8b2de2d21a8564afdbcff +:013a5011d8ee9ddc09773ff76fd9389686ca2b +:013a6080923180dbf66f7b95272f6f0d896814 +:013a70f9ba8a1a678890f814ceef65690abf00 +:013a80ad1b63eb54459a3bdb575a3ffa1a0211 +:013a9018e888ee9052fcfd9b0ac710db59b9b3 +:013aa07840542c58c7160273a7f67f2ad8b4fc +:013ab0b06d34afa22fdc5b34260472a7cf4c19 +:013ac004fdbd4c7b247fe08e1c9f6ba08ea0d8 +:013ad09388ec1848a8cdab389fc14259473bbe +:013ae0a9e804f5fb8ec60d3dee2803b2a32910 +:013af052d5d8467bd8b80fef32f779e70b4338 +:013b00e181d3156dff1ed9d29d435be6d8b24b +:013b108882e2df4018d2f1439fd771d2b1949d +:013b202205fed6c0891f2ea95b364691a50f6c +:013b3024756da0e19d2345d23ed09665403fc0 +:013b408f0ccc05fe84e04b665652b03b15f4c4 +:013b508016e1ae65413702f73049acd3e1b05a +:013b6034c50174d82fb947bb5a69740b89fed2 +:013b7020c76b515a3e66a24dc58a0a9acc51e6 +:013b8069fbb29f3eb905ad2c3ca91c64ce01ca +:013b907e0ff33c408b4b49706e0a94c9b9fc57 +:013ba05fdbf1d544a2e17c2c17da80d00db984 +:013bb022bc06549ce2b42a7caa27e93354bc66 +:013bc0935b1477e9902b21cb809d0a6d22fd36 +:013bd01b03f0dd185265344d9b607c87c022c6 +:013be0d39d42c858a31a0d89e387434e419b59 +:013bf0b35108ee21f5c57e8366d957df1d98a8 +:013c00daf8d2d9aa6f02f3a2ef284fff1954d0 +:013c1039e0818d17c229e0fc978e2b6e6847a3 +:013c209da2aa62400a1889eac7b936cfdd3fe5 +:013c300e5d237d54f8ae4f361e9badd66ab1c4 +:013c40ac1bccfe0cac93bd9d8945f4ce636187 +:013c503a2c798a1182f2eaa32b3aad30412fcc +:013c60c4e024a92f9e7a3579d18ad067316580 +:013c70a1a958fc5be74b63bcd6090b35268bbf +:013c8033d5bdaf68f99e4e3e417f5c233c156f +:013c906549b4c5d13e41371c5ae62764055888 +:013ca0dbde4d9e8a8de04338b8a79e7f56b052 +:013cb034ad76984e221486b980f27344d62ee4 +:013cc0a18e4d71a8d80fa2418810672d73877e +:013cd0fba2c3c9b34af9e4b216ce0806db5fa7 +:013ce0db9f84db9088fa47681490b2528227af +:013cf02d29ba82d1c905a432dfbe111b75a338 +:013d0038e64b3b222d4c9f8fc79e547cddf2f6 +:013d104dd9c80fc620efc37a9772ebc75e22a0 +:013d20ed4f8c39ad661a93ab4c1240bc35ed52 +:013d3090a42c06d70d97d2a5949cf6480d7d3f +:013d401b5db925ea08fbf4c0ace8b71741661a +:013d50a316100e8bb07012b9f03b418bdd1349 +:013d6001128676eeaa90676527ce6d3b52480f +:013d701cc4e348ac6136487bf288f720c4b707 +:013d802a8c3230e1d351550021dc5b585ee205 +:013d907bd3d145af925d9f4a1c74f09390cb88 +:013da0fb04935a30b242e8b573d545f3f52e0b +:013db022bdcdaf491998900ad657e10ab45c1a +:013dc070cbd51557819f6458f7a1db504e5eac +:013dd0ac19432a5dbc0d50fecbb0039fc01de6 +:013de0368e87a35a702b23fd9fad080e971e4c +:013df05c23cbcc4d2056220c2d82fca4fccc7c +:013e00a70d369ac6297b78ae18a7f694248ab1 +:013e10b49141ff2387a507aa424c7c3bf4754f +:013e2014736298e6e0c1ee3e1056e1af84d034 +:013e302aa502dda55adb8d57b7fe832a614655 +:013e4023d65f809313de3e9522f68692337ceb +:013e50ae944a5c785bb38cd78c4a409c8bf4ff +:013e6087f753c7867b668a86fb38f521635e63 +:013e705789aac2f633fc475dd7036d50c6df56 +:013e802db831a31015c66bb93136c8024f08d8 +:013e90dda7156b68609cf168854a7b0fa15952 +:013ea024552db064a08b25e2c5564e0831a3fa +:013eb04604f359eeffadd5d13a972a7b19edf6 +:013ec01f25c4190550b4db1ac08573e41344b5 +:013ed0d8f54886e8b497b4570752e9c6945cf5 +:013ee004b7b22c3ac8aae298526f06e6f120a9 +:013ef07e8d9fbe8abd6c4aa4678146054f7024 +:013f00d1752c45f1b6d5317745775e2813954f +:013f1031c9bdf26e792a11467a4f9d8b8acff2 +:013f20eadfa9a96aaad1ebcbc3f17c1ed8072c +:013f3057fd2f4079b7eea82e8d71898fee2947 +:013f402e245cd0f82b5b618de438d6d20cf48d +:013f5001e7ac1c6fc23f1dbf08ceff1f213248 +:013f60e290fc0d2973b782965589d18d150f7d +:013f70a5a5d06e904ef544399144bfd7f1a87c +:013f809d9ea318c8f670b5dc0e6394f52e22bd +:013f9043a9e12c8e7bac1b46be277eeb69d11c +:013fa00704c9284a71c9e9acab5ae5c28ff035 +:013fb0788d81534c55771386c93093ebfefc6f +:013fc0706c18ca8f8f7575c486e09ce2d322a8 +:013fd05824e1034ee98f03990d6069d5a7f517 +:013fe0bcc6ccfd452ca07f9e4ebad41417245a +:013ff058d14dd1fa5b8085b365d134b0d4f935 +:014000a0bd79cedbe0a313301dbd3ef48ddafc +:0140109d3f9ae092b306ca437cdac3e40b60a6 +:014020ca5eeae48a7608dba5daa73cb2645283 +:014030d5f818294c29ef6b4055455cff2a7bc6 +:01404064086cb26d6e4fb0114169970b51b878 +:014050e5ac5280228823fc463e3f3f1308e0bc +:0140604933c86137f6013e70b78e4687db5605 +:0140704fa6e1603f60dd54f63ac1dd7e0d10af +:014080064e7c43971bb224d07ccbb26ee40f88 +:0140908166eedf3ec000a876a568008352e813 +:0140a01d1025bc1cb2415c82e00bb4a9e6a7ae +:0140b01ef9e35635c9b9f8adc17eb116c64f3f +:0140c0048788f6939ffc600ea0b781a0c48d39 +:0140d0d0d6205e7317316430910c64824662fc +:0140e0fca1d2753132138d5d3f838177a53db1 +:0140f04072dd2073ffb16fe7cfd92cac9e5879 +:014100d1791784eaa064cb05786f348fdd0343 +:01411028cb294833bf4f89bdf59b1449b0f1fe +:014120c706ef3738cf6ea7267000625b31807f +:01413073194f10fc4338e7f9630132434117f3 +:0141404648a28b96e278c3a07461cbee3cbd8c +:01415009b5d32745c3b0c25c5111efd91c717a +:01416063af679676af8e2cb06c79630bdf6407 +:014170c2e2435430ac3ba9a83f9b26d4bcc9d2 +:01418020eea9cb309c1f20a8af4d395d6515aa +:014190e961c0544dc63e0655067b1d9d41dc15 +:0141a040920aa9824d2ce76ac046722559327f +:0141b001bb1d68dabdaddee5dd188667fcb9ee +:0141c067b81c8e79ea257c38e79edfea2f0685 +:0141d0f072766f57268da046a22bda1913a6f7 +:0141e071c5f18c2937db9d4c80eedff8375d8b +:0141f042c44476a03f77dd73d2060115fe7694 +:0142004e2e63521d7861ce7c0134286bb532fd +:0142107b90a5f64716d0dfd9e1fc39cdb27198 +:0142204f50fb41456a93c1c49120d550c9942a +:014230977136e250b633b0d6744aa2a83b3968 +:0142409a28f4314f0ca0f01cd4fdcf0857c73e +:0142503e1ef87bfe0b7aac0baef925043c60ab +:014260d6a1345ecc93b95295761498879f99d9 +:014270959e96d9573a67f1de411b26db89e7bd +:0142800b64fddc5ad4e5e0b2e323d8d5c67744 +:014290def0d90f85a6c7948d0059a6b406f554 +:0142a05c7374f9f9d5840745e3dcde66af94f2 +:0142b04364996511882150aac45558b863b21e +:0142c0fb7990ca0439cbd8b926371a24a16ed1 +:0142d01f59b35742f9cb68b5ac47957eb38017 +:0142e025c9cd45f26ec084b94bf487421dea2d +:0142f0f160fa6b166c7241d1e5acf873d6eabd +:014300f0892bda5f030aeace58634a98100e54 +:014310637c9dca9ba48bba369b81c97dc1b291 +:014320a4aec12216adb442fedd46f145879bfe +:014330e8fd17dca9494aedd7a775f9c22dad06 +:0143403df56baf8690323a56451f4d17881fd6 +:01435072102e167a5c0cf9cef2be6562bdf695 +:014360672e20ad528f62790dd61640bfe32674 +:0143702d015dd0e144c1b5a2882f9ed28a00a9 +:014380d1d96587c06ff92e56fcb63e3e3556aa +:014390a5cb78e26edb6e5a539cce6ec36a7f8c +:0143a0469c61256e336284ff26d47377dc7143 +:0143b0e819d5206d490a289c2d373b884f9050 +:0143c0ab88d0c6c37e8452fc3702bb53165919 +:0143d055b9d55da449e25a267f51243be3e353 +:0143e0c4968987419be5771c9c6a95e02d7623 +:0143f0510b84bd05f4282fd2979d9a1905eab0 +:014400835d15fe2f4212567807e356d227f0bd +:014410bfb6c6ac2e4fec924e2a58ff0789feeb +:0144206a200139bc900cd0ad7e723fdd9ed7d9 +:0144301ed1b162e4a900150db00ec5005178c4 +:01444094f7ed391b20b7345b2939c5fdbe0299 +:01445085e64fd7c6501587af902030f853d9e2 +:01446027ee63230c8bd45a7d1acda68ed274a1 +:014470400472038f0f4ef36eabcefe970c3afa +:014480cf33e48a0875129adcf772905db6532b +:0144903f2343c7422d6cadd65c63c405581d2c +:0144a046c994b1732f192dc01f7a646f04f3fa +:0144b01c290537e4d1743ae6025a7aba7a3056 +:0144c0260556692dc6b15badbd9e22a0b2875c +:0144d0f39cc193b086d1ae3884c08ee67b7b15 +:0144e03375a1c7265d039b5daf128d8d57453a +:0144f056b786a7ec5a197839d05f56dad38ab3 +:014500c1fe97762a7224dc180750ed0c285f00 +:01451076be17ec9593b752bcd667bd254ed964 +:0145207865cc16f9e0c939ba0953e197bb8ad2 +:0145305a338b13d4bb31931b222ee26533ff7b +:01454052305f006c6e670409e47fc9105dd3d3 +:0145505b9424c3ecb60fd784d55c971b19eaef +:01456078a33ba2920333404e8a21e14d9dab1c +:014570140cbe2199cf05e499f4df91f8734499 +:0145809f979605e09eee2664e014db8161a33d +:014590ab9e0c2ccc431e466e65ffc8c14c573c +:0145a01b1e04690ac5819fa4d4fc38ceb954e2 +:0145b0df999f8d118d6dfdfd896c0413339062 +:0145c01cc18dcd79c380d81262de63062e3885 +:0145d0b01248b6a0630c9fe6aa0ff53023af28 +:0145e0a5e75c1e3554f97562a54e9c5eb6507c +:0145f010fedb274af56c6b273b0ae697ea69eb +:014600de66621298c04fe3c1e2f3b1ab1f4580 +:0146102de27603590de978ffb7955082babe60 +:014620366ff29a16af0840ef58f29de6118220 +:014630819740fff85a2e4d84dee70ca61c7906 +:014640a3ff6aaec958da83c766a0a7a5dccbd4 +:0146507f4dba656ab5dd2bbd870a2118ffc0ad +:014660b55acf2ff67c6161e3a52baf47a9c7cb +:01467093ae9bc930c2f0bae21bd33581b6ef06 +:0146803fdf566e40c8b17cf6b9aba8b5c286aa +:014690292966fa08922d68d898921d63823ae8 +:0146a00c9f9e56b2e2ba4571b7c42f8f3bb900 +:0146b01eed5b1f9f35f0dc663093f2e66f3cdb +:0146c010c2d21244ac5b8b3f2dd2da2d12a978 +:0146d06ada189e0c252c6c46ab21454d2d36c9 +:0146e004691abd669a265ad6b2c2323bf01737 +:0146f09e2a34ef2191d72fb2dbeb31eee31d0b +:01470058da64c07444216410aea6815d28fd1b +:014710f1448fa6bd912dc05dda814c3084d344 +:014720f737d55dc8537895a87bc10b2c9473fa +:014730e91a33b4d0f4e3c06be2de320d094a8b +:014740f726881d403037036b7f3d43722568f2 +:014750b0a2b872ef0161c5421f7ee5200b7c84 +:014760ab141d55a23ccae02aaef20da68d47f0 +:0147709c873133d4a63f17a45e0d708b77b16f +:014780279835641db1cc7074fcc9cda3ec2567 +:0147907cc6aae92869779ae1474d8e87c405bc +:0147a0b7ce8700e173be3a3d08d65fe0979050 +:0147b0695f2bbacaf74b16486ebdf76e944ba1 +:0147c08ee295ef9545a1d89b30586feeb11f63 +:0147d0b54a0e2f8685b629c36a2ea17324b522 +:0147e08ccaee2ae2e56cf1e88f3db08fa8971f +:0147f023e00359737494b01ba250a9a62240a4 +:014800b4df541b294d87c5b28885460e9e64aa +:01481033d3d98bed175d4c8c547bd083304896 +:0148201aed47a837770d4ca2bee051cab3358d +:014830a16c2fcb54b5deeb0a61e839d29bf27a +:0148401a0d9d9484cc2c4c53214d33b0364d78 +:01485025801bb73065da063bacb56f284195c7 +:01486071aac6ac8920776e4d8b5a36c4cc7a88 +:014870b20418eeb46f1f89af1fcaadce106903 +:0148806b4385fab7dc6c87cb511af6cb949808 +:01489098ee2c11b09918241f530a6e60b5aeec +:0148a0fd2243d7642f3f1bc3e3866089a59e44 +:0148b07301467b7e950f7d3f901558aca20913 +:0148c0961112a5f23f1adad158824c3d5579fa +:0148d07805011d51a006a495ce40ee511529f7 +:0148e0535a1302af264a00b2a4d689e97fd348 +:0148f08e16b5217b56b217c6d1053ea7eb19ba +:014900a04f87c2487134188fe8480e262d2ce8 +:0149107e8c9118a19dff01e0bd3b85d9ad85c9 +:01492045d2d0de0ebfd438924ec69dd754e31a +:0149305ab4c8da2172229a0eb13f46029f4bd7 +:014940ae09d03a8ed6e63742d5c840835711c2 +:014950dc2a30df84e1d8e74a20b587053db80e +:0149609337eae936e9503211bf7a57fbde51fd +:01497028d42d18def3a2d0791e2d83874ce528 +:014980accdb86397a6aaf59f8072252b58b7b5 +:0149902449f59bd51b528a762393e039d9b954 +:0149a0316031fb11f52a903f14ed5d6832938a +:0149b004c6a3bd080696ca9eb2c8eff43fd6d5 +:0149c0720ba7fb8f459747ed45f66bc5f038d0 +:0149d0e379d6ed4eb05a43ea4393349313d44f +:0149e0f30d6f2f0c02524c8cb869e9b5e4c4c0 +:0149f0d5f8e3bd770cb8a5886d1f49727c2306 +:014a00affca1b2fe1bce457feb5d8cac5cdd5a +:014a10204a7f627333b2ea60baec055538a505 +:014a20a2730d4ef737df52ada6f1049c7390d7 +:014a30c285473090c3c3934212e7939afa9697 +:014a40bbf30f7fa0c2b73f9b54653f1190cda8 +:014a50d4b2622999388059f01052b43cbda9e6 +:014a606e1ddce246f10e5b107da2b8abd4e51d +:014a708ba4b98e39589566c77d272213d458fd +:014a801be5701e3475edef3df51f94076c1ca8 +:014a90e339dcf35e85ac70332ebd727a2d65cb +:014aa07e98a886d8c106175803a356b8ebbc0f +:014ab0cdb48259e7a2b1a9a4ef34a685b7cce9 +:014ac0dd83eeab0bac5f9cc7d864ba84fcbca5 +:014ad00a59f86f0a1db66c62f7a96dd4c76680 +:014ae0f7f6bb220186bf6e9aa4f45b322521e4 +:014af07bb10493c91005a11b6249382f1fc780 +:014b00b7bf25b45ff3178b61ef3a817b5c95e0 +:014b10afaf64688a2fb782cd39d3b3f16673bc +:014b2053636fdde99180954521f604c7641ced +:014b30279376bec033b821a55838eedec246b0 +:014b403c1eb5ce9e1b9d2d3d1725d545277893 +:014b50d3416e0712db3b02047cf85a3badcb74 +:014b6051cf353424d282f831e3c70f6523ad07 +:014b7085f290f1b6efc972ff6b89fbda992e5d +:014b800e498f09779cbba691bf49e7739f41e7 +:014b90686307ae6f06ba191d6ba2429205a624 +:014ba002cfb407f37e40d1f752c900fe56eb9a +:014bb0c5094e1962a2107d4c7f9be1dad8ce0b +:014bc0b241417abe5ce241a0b57fedccb428b0 +:014bd066dfa62d1412a3f5a89a1524d160c952 +:014be0180c480e17273d96c3187afee786c3b0 +:014bf09f424a31c4c9e2d46357621bc08469d3 +:014c0032f0c485789a65d80ad9c0804d5c8e77 +:014c10a5e16736fa6cad29003d5cf79a926cfa +:014c20512a4debde6dfb81d51e0b625aafcdc2 +:014c30d700464f9c73ae7882642d37a3cf2f6e +:014c40c402e1b714634705857a0199659ccb63 +:014c501c62db6a02e17153f2069f92ab6e391a +:014c607ddbff1836ee1b047054eb2eddbd6b34 +:014c70ceb1d1007bbbec9d305c94f5fadc9403 +:014c807602aa8fef675e77d4670eede098574d +:014c90707435de702fe553f428ac9679329b4d +:014ca0b93266931653936868209b05a64f5469 +:014cb08645f1384486724897be3750afc0bdd3 +:014cc0e04527bd5e57f5dad0b01054d65f845c +:014cd0427eba2eea27009fa2077c571ec1b036 +:014ce0a3f2b4387f3d6094966204dcfd07efcd +:014cf0c016486b12cee285155d17a9ad9e8391 +:014d0036904157a9b765dc02d407817d25bf0d +:014d108c0d93915358931d9769b7ecfb2d14cc +:014d20c455f172e47975d6a9a161cad8755ff2 +:014d300948a0955dc71e9e2034c25598e3bf91 +:014d40f00e84cc617659499a5c54468c6723e9 +:014d504b2710efc604e15323ca1fc9b365bf23 +:014d602c8e49f2591eccb1e37c982dcac4be26 +:014d707cfda4afb75456f08bedacada642c61d +:014d8062b3b591eabc4e57fb5f5a9a509165a6 +:014d907725cae1ea013c7566be9b1473dc4967 +:014da0199020c13de55eb62c8203b82c10c8c3 +:014db0166e0c9f94b3c87d3957d4d853680e24 +:014dc05cf89f1937fa3f2b944ff17f3c84c13e +:014dd00ef3af4dbf0b40e69a36c5bcf3636d17 +:014de0c02f1e00d02c2337641d58e4da66ed81 +:014df0ab4ab7321bcd89056a18c103a5c3b6f8 +:014e00f03b5cf2966c95face8a75c8d402f993 +:014e10c4aa65782fbfc7d436cca590e34b7580 +:014e207bfcc10ad509b76f3f83e89288515a26 +:014e307733a2697c8a98f21015db2b7996e618 +:014e40177bb71669605a13c425b8c37a12c480 +:014e50fa454d03ace2347c8cfbfec7d48964f4 +:014e601b7b9215e6b7bbf49dc89fc92aa71987 +:014e7002c912c86a39ba684a40e365a3fb61e4 +:014e80cd4fdc5bdc17e7f734e8c8bb80d3ef09 +:014e90e5726c773806f939902ad82ae02c1752 +:014ea05a655b435b44bad723c4ae2455b38488 +:014eb0c017405d8791e1589d4106bc398ba4d2 +:014ec0c868a7c26890c690595006a8f7578e8c +:014ed03afb2996eb0ba4dc127c02b78fa8aa8a +:014ee0f14c81c53f13c4b3cb283fc85e0d8bcd +:014ef0cfb494d7fa17c75db5bdda363d9dbd70 +:014f00ee442b59d72dfe868a836a1f423f2848 +:014f1010036fcee75f52e6707b917b5a186079 +:014f2096b19ba9a5c5b3ce3e0f4c3a20bd94a8 +:014f3017df60a6aefa735767d57017432e2905 +:014f400328993e247d46fad8eaafc189ab58f5 +:014f50904a76eb39571e999f23099faae58fcb +:014f60757d248089aa3eb346038d79a3f63bf0 +:014f70503bb18ccfbb579cdfef0ea0bdd06a55 +:014f80bceb1a49eda90dd6fe84cceebed7745d +:014f905c1b81c830097eb532e2509dafaf0511 +:014fa0ace185bbd1aca0141b24ec874609f815 +:014fb053bf3e3b66d86b771ae3ef33c169f699 +:014fc052a2d6aef14d14f017766a11a0c9f1ff +:014fd0daa0bd3c7b0a4fac8d61da85626f529b +:014fe04987d788d38b0df51f8acec92be94c34 +:014ff0a4c3f781aa23134fae77182d875638cc +:0150004dc0aec5ee1baf250864761f99d90acf +:015010d8538677771c929ec8cbfc8b4f108653 +:015020a975ba44cb6cebf0e8f5980d3723a366 +:015030fd36cc5417d2eede2e2f7bc2f2969be1 +:0150402c29427fc6f146208c483288062637d4 +:015050c43df458296c8fb1063b5b0a2407c941 +:015060066384226a52d415eb0df6501bfae54f +:0150703028b419cb48e6ed7fd6440c8ad93d90 +:0150807120c731d6f74761b28a0e1febbc2f5c +:01509000354d076e812276ada431a1de40ca3f +:0150a078c829b2d8099e63558df1f28e0da57d +:0150b0a3694bebd105ef026475578bf0e8c302 +:0150c0e7580792d28028892a025d47006ef496 +:0150d0c5c5d8971cbb8323bb0b075deea42f16 +:0150e09396a20e88646474b718f4afa9d69cea +:0150f02da11f858d15adae4979cfe5012565ad +:015100c07bfee9375a606ab903fdb34c321ceb +:015110deaf767160aa95b43c4ab0d0f083aaae +:015120b4377adb95ddc1236ff56f22384c33e1 +:01513020bf2ea0248b32126816c7280b138f53 +:0151408d6ccf275c00da689c04a063f0a4fe45 +:015150613ec161a327a1dd32071435716d96ca +:0151603e2f0cf30d2f761324a4cc39890030d7 +:0151700eea9f1ffd33a77e0094294e44b0af61 +:0151802b554586cd825778a16725b48bd65873 +:01519018538cfd73958f5453b47e1078b00036 +:0151a014a0bff9f714bc3a040d615870e812d6 +:0151b0a91efaf4b8388cc460cfb2b3e34954b8 +:0151c05a844318c44f6044ff287d67acad451b +:0151d081baa525bac27c02a1354bffa6951d75 +:0151e0fc9df8346168fccaf9ca18d51336630f +:0151f0039b174e39f62456d9496f8db4f30647 +:015200765d16ca6da75d976ae424585f14ae51 +:015210c5d0efa2516c7d78048f74026974b3db +:015220a45f6d82d4a7dcf3cc2569c85332c115 +:0152306b9c615439ab59fad65c73a617538adf +:0152407affc1cfaee4e84f593e963900a9f2f5 +:01525075563f22c164c5ccc2784082a6b7f87e +:015260b062836225fdcf039ab28765b06a5a78 +:015270707c0940868118bd284738d7f2f5a4c3 +:015280c50e924636edff0520808013d6a2610c +:015290c91ecab3d49291521ddc3316a4174cbd +:0152a07431e2c13c4f063bc9b7c2cd0def9781 +:0152b08ce74cadc52b5349eba5c48b272e75ec +:0152c01ebd602e5349959b187c80f588084e99 +:0152d0435625a76549a3f6de2a64b00a66044d +:0152e0dfcf647a00c8767b56b85a3c425d2375 +:0152f086745c36ce15ea51e0c582c06937340a +:015300938936055b3f3ab6565ca50226a03975 +:015310354d27fe9ca74c548b96a13dec6335b8 +:0153203a8b8243cfd60dce22b9bf40e0f91854 +:0153305cc05cfadcb18360b3215805619fa26b +:0153403e07ae52c62f60d0fc1a225c6eefee0d +:015350fdf64f11488d6e59300dfb56afab93e7 +:01536049198c134acf4e7e4b1c024700208e8d +:0153707ff80d3fdd658dae1f0ece54058a9033 +:015380fd2594d15785187c242a42aa8e87f918 +:01539065a3d281417cfa8d485dd25e0d640994 +:0153a0beec39842f18489338a9b89ed7ea56a2 +:0153b0b48f767b525e2742163beceedc1a4c53 +:0153c02afb9a86765367e5863e67313aa04f36 +:0153d0a0c49a171e61887d3a177d2784ed7331 +:0153e0356b8ab5b3728553a125f641e27fa622 +:0153f00ac9fa0db21d00da61c022a37daec48c +:015400a9dff9c494c6b6ccdc1e0a9bed859af8 +:015410e2b1cf6abf91238deb6bd14069d431d3 +:015420f212b532d34313d99fbbb43d189c3bc4 +:015430febe7ddb40a62bc27edcc1a4da6d59e6 +:0154408b6e16048a8fec13ccf4e61ba732f684 +:01545004d8b5f5c08e6ca04e6ba954f25a78b4 +:0154605963246a9cf30325b443a137ee53682e +:0154706642a2bbb171d836544c113c0fdf4c1c +:0154805e4fec000c57d26a02304c601f997e34 +:01549065ca1f6473664013971f26a70473d0f8 +:0154a08ddc7cd02ec324545a1cb863c060ee3c +:0154b02dddb2352ef604c986e04d8b4970ca70 +:0154c0e8ece2f93894ae853a6481050057d8c1 +:0154d05eb9d44c1e36a173ab46a14d5e869452 +:0154e02ec659a91d84b3a4976a8f92b691eea3 +:0154f005fb49c59c219e961e48f97d01821c6d +:0155003456c8e5cab06efda845a2b6cf6cf05d +:01551020fcd6eb3b559536cd74532ddf053ef4 +:0155201db653c2de648b7c2ddcd9e349ba8ba1 +:01553040a4f9e8110b130d7afb5b7ff25e8d8e +:015540aa3cc2d5235a33d4d0fa09e1886c06b4 +:0155503e30453f38011ee867e2c92eb2010133 +:015560a53f862b5760538a000391ecbe1ad7da +:015570a3773a308e6573cb00e7278cc588689d +:0155807a8b0a68f029d93b7fdb2b463864bc36 +:0155900aae76db0b0906d72779722d54a31e2c +:0155a01e06864f7178021ecb8fbfe49e24145e +:0155b0f7c40de3be7448c01c508acdf414730b +:0155c0bea121fa528b1a1b7bee487575e96103 +:0155d06209bb2f93e11f9ca33fd9ce07824d9c +:0155e012aa7d98903bb7d53826af0e672792f6 +:0155f097379a1bbcc4dd755db2296f8d0eae59 +:0156007a78db4e10010e26f68b85cdf0dc15e7 +:015610e9f38dcd7ed9bcdf306e0a21856564b8 +:0156209214efb6ef34c2d83fc7de69b05bc1cc +:0156307e9bcee339b8ef8cce73b11ceb4ecc99 +:015640f22db236f1cb12d66aa5ebe57ffda8dd +:015650978e409b9bd372b178129e8d6728ed7c +:015660c8f5a2f0ff3aaa1a1d32d538fde88628 +:015670491ae3aecd74f3cbad9af53eaa63089a +:01568047e9818ee04d31bf05af3a37772d00a4 +:0156902f028693d123ebc5faa7b437cd6fe992 +:0156a07a990d4b8673ab3448cd00fb9ebced89 +:0156b0d0fa8f1e1b6ce6bfd9a9d2943fa332a4 +:0156c0a57f5fc20b8323a3857323c2022dfc50 +:0156d0caf6d762d4332f35849dff8443e37903 +:0156e017e0b1b8daf61050cb25a77c2596c048 +:0156f01825c38881a4750ae06064cb678ce292 +:01570068da5e97a2c85bd02ac6145e31ba5f42 +:015710bb86aa19e61d492ac5fc1f4da0448900 +:0157207ea3ada6b9030c7ab6c6b7a6cc24bf6f +:0157307af336c8e8cfcbbeac1096ea196b463b +:015740b9dc0ebcf736c0a0518e62ee84a78fc9 +:0157503bc6c73b5d8c19bae78049b1fafb583d +:015760af75d671676ef02cbdd7af2eafc95b5d +:0157706a7dc7277dafbdff93466147503baefe +:015780a0ae6139007b1d6dccea49582830b45b +:0157902e1c7c5c0fcd578c249e2bdad367fdc2 +:0157a0ebb1efef1bce289c308b1cefbc756f43 +:0157b0216c164b1fcbd740875fee9557e96743 +:0157c0a84621573330617ea5889a38b7938721 +:0157d02f66dc18b7b88cff0435864afc56cbf3 +:0157e05be3d40c8a09108ebefaa2731937bfca +:0157f0abc1606ecb33d7dd766aa2593a52385b +:01580042400573c335680288620b700597c027 +:0158106d99ce3e2c90df6f5661a8cdd28076f2 +:0158201ceff643ece82ad69955096b085b0c32 +:015830e0df5fb1104b165a41b9ef79d0d608ae +:015840330cf5a3f5ec0fc013e2c676b7f75c1e +:015850f905a948fa6b2dac332f27608af7d1c9 +:015860a5e223adf8344bc10434fed1b33a9297 +:0158709a349c4f941d7a454bea1e1ee74956c0 +:015880c6b443b718dbc271e6c3dbe48a929e70 +:0158908747c59faca8cb2bccc4835ff0c4ede2 +:0158a02723ff2bf66893efe15a527147d426cc +:0158b0b334f2216d62ab712d07b27f065eaa76 +:0158c09c8951285813f7986ea42e068618ac5d +:0158d0dbfb39d42fa1b96df39562b89e2647c3 +:0158e01b66103ca02a9066c938ec92b93619e1 +:0158f0d34d106cabe67ae2864e8120a57a1489 +:015900ff5f802e448e40921971600f4bf93e10 +:01591038654469e729bd0be0486b80cc3a626e +:015920ec425b64fe896ba583d93cce94b998fe +:015930400e993b1b40534d54bd687c80666e8c +:0159407e2bc7d57f07afbe1a24bd86ee522b8b +:015950f84db9568033420196156dc7e01b6598 +:015960aac4c7efa169bd94ed85c5adaa4fc9a1 +:0159706618eb4cf35c4cece17b65b5cfea256c +:0159802299f3943075cd0416e9841aee6a9115 +:01599085a23e713050a80f52d74874013ddfb1 +:0159a0feb1ba3f2118c3aef8f48a6577a46724 +:0159b0ccbe83b118864dcde0a7af952f3193ae +:0159c0bf0779fb0dd433e9a90f09d20715d2f3 +:0159d0e17d172b27c4b25a72aba1b393524539 +:0159e0812adab5fe6bcdb6403f3f624008d72c +:0159f04eb6683b5dc67b54fc8ef82b6525de14 +:015a00a012410b250d398954a05ceff30d9b72 +:015a10cc9df8f34149c60dfa3c1efa54f34b7f +:015a202b746e8633c885cdd35f6600abe4c82a +:015a3033605efece0ba39ef7798e758ec1a662 +:015a401fa85a05dca246b45eb62881293bdb2d +:015a5079ae4c7ba7d3722d74d84f1b9839aa5b +:015a605b86db07f181b60eb7b859e50ed8ad2a +:015a708e41b44d5c53097137e39de8a56cb54d +:015a80c903f7ce87b1a6d41df51ebd328247dd +:015a901a3c9ad5985efd6618604df7c370ac8a +:015aa0c19f5e64880aebfc656d61d896a8f32d +:015ab0a66fe86ad2c8430a5328eb821119c58f +:015ac0eb6187132aafaf13c4de04e0dcf2ed50 +:015ad059abd309f9dc27fcc5c0ac425496126a +:015ae037ba9b83aecd3d572018ed096dbc2a7b +:015af01e72628833fdc11c3f01fe6f62a1019f +:015b00f8d299e06709ff0baf0e383c96ca85a4 +:015b10bd655db321ff09405d8deaca24366e0b +:015b209bd5cb5ceaa3ed85406ab5ea02763f1e +:015b30b2fd0e32a7064c5e107207c3cca436a0 +:015b40d2d89974bf70a76160382f9845496ebd +:015b50b793075963192e1c135654148c7d9980 +:015b60ad35d79a8e68ecb8130727363c50c245 +:015b705599a6a23fc3d028f9641b23be582929 +:015b80f6c837e814624ff37b9aa395027db7cd +:015b907abe46ae27ebfdfa3fa9cebffc848751 +:015ba06415e6ef14b976cd5e4a965bd0c772e8 +:015bb0619a44700ab27c8a40ac56cc93993b7a +:015bc0246cd6a3ee8f04b752ad91775a70f283 +:015bd0cba9bd93372539eb851c418cdd835a8c +:015be0b34dfe48d553a06acc7bd297c7498365 +:015bf049ecd9cbf4713ef3483e967186c7da7b +:015c00d6648d6e14473a0fad1db8a038d27fe2 +:015c100b7afdb68880c459177702cd98800567 +:015c206c6394ffa100b32a15c159e0187ef934 +:015c30f02c1701d88051586090a1d0756a144c +:015c402bb8e318db5c8b165a77826ed212d63a +:015c50135a9890e08da029631b54e376b65abf +:015c6015d09b847e38968a921c17117c4e0404 +:015c70d0dc7517593580de49cbc00976625c6c +:015c80e2a7c14fcbde47f9000fb69cdab1a793 +:015c90ebfec7369b516d6d100d3ce02f9ed813 +:015ca047dc042fbd636155681ca21cd0f1f6a1 +:015cb026e64c25e5d97380d02f528bb00c64bf +:015cc09746a7ca6cf4076574d0740b67923bea +:015cd0397bcaf1ca9a606924e47ef863dfd6f2 +:015ce0eecf7235b3e25855a2ded47ac1bc564a +:015cf09616ef0d08fabea1c5e730fbf8da2281 +:015d000d0fa9c746305cf705b981d94bd61d8d +:015d1044b77c5afdbbf38f1815c13e5626bf77 +:015d20e208c8c39c0fd0b4c89a59b22afd4e61 +:015d30e7eb5304af50e537133365c451db1310 +:015d40427badb70d0a3f939d6ab3e2c9b3525a +:015d50bdcae1785d9ecdee25c7e509b4a688dd +:015d60644e027ebe64773af3e7c70e4ffdd3ea +:015d70c80b508fa64eeb0c2b5db97d8e34932d +:015d803ed1422647e34c878f97abb7f14baa8d +:015d90a388062480608d014ea6763f6571ff8f +:015da0148b5d84f71ff3e318fe775ad8f02fd2 +:015db0196abb3edd7c4c8f0be16ff91c542914 +:015dc009601bcb9fae67c0ae23cd10705a1034 +:015dd03b23f4ccf9e8b64437ddd23b5932412e +:015de0c051eb12f24e9fe314249e1f81129379 +:015df08ab4a12411a7ecd8be0645b4fec5798c +:015e000bd7c3abb1535330e9fa4b1f67e8d5f0 +:015e10805cf194748876f6f397ef1b84143eb2 +:015e200870a1a07036299dae659fc1d2e24ed0 +:015e300ec70256e9b00f23967c10782925fae3 +:015e40bd7365d732f34ad12b36b5eeb67f691f +:015e50bd8e4acdae37ecdbd501d17cb85bce79 +:015e604f508c9d417c0fbd4b42b4b8599a2e56 +:015e704b906242f1b4e565aa4113dd899956a9 +:015e80b2d219b05e6867b8ca630880468f5a49 +:015e90068216c38da5a94e2c80a2aaefc757d1 +:015ea0c94f4f76da05f6a7499b6e68d03de944 +:015eb032a69e35c339892a18ce92a257f23f69 +:015ec0e38dbb43c4ef9d48351c23dac06c0c6c +:015ed0bb1857228ae660953eb4eaf2e6116d92 +:015ee0a887ac35999104f292ca3280e6781c5a +:015ef0c4eb1de6d0954cf336a951e9e2b8c634 +:015f002575f55fb9566d277348ea7659418479 +:015f1049451432e87f917fe9fa9b346dfd1968 +:015f20402829ff3424a4b779224548ae4e7565 +:015f30c62e55da37dcca3c7840dbd44d69fc7a +:015f40d330904d6482235711b646f01d0b14c1 +:015f5076b9bc335e0b428cf67a289b915f7444 +:015f60aa64f7ea6c7993700ff5aee7a232a1c9 +:015f70c3982b0db176f7f8170db56bf90ba651 +:015f800c38f77c6bd0e3ffb926d8b307f6e9cb +:015f90a81d1031f7c67325b28dbd8665c1f66b +:015fa0bcbe4944264322a731f16e24925e67e0 +:015fb0302e2047036a8c412792735aad7a2959 +:015fc0bf4c63180afb853d5a43f4b9685a5338 +:015fd039a7a1320f8316d68a2509aae274d09e +:015fe091521d51e4018fe6339ba2eb29e78af0 +:015ff0067ff6c110f7a533df39e9daea5b0703 +:01600008e466b7e3939089caa989344aae16a9 +:016010176ca3a41b7e014f87f9238fd99287fd +:0160206193ef3f3b0981183e8410e3a8977aaa +:016030282adf87dc2b616d3d1bc8f3380581e5 +:0160407ea993973e509d3be6c51c57f5577369 +:01605085f9aa306e8d66a36221e5f0017edcbe +:016060bb9d85c78fe7e5bcb7d7d9f5ccff4484 +:016070ad75c52d7e7f2782f91a475b499b1a95 +:016080ac42e61c0b11b120b50a847bcd1669e2 +:01609032afeecdba177a1607b173941005ac24 +:0160a0efec1e10b7b74443324a934e7ed8f60e +:0160b07c38302c330153bab74c460dc3bc127d +:0160c07fb274bd57ac17a3aef34e5d65481ce4 +:0160d01b61d3e2c1c7e5ee23b47b14ad513fe1 +:0160e021b5733ab6121963595b4a47f3ceb116 +:0160f096ae428b99fad9f876d1985952114744 +:01610047cad9a398da3b8cab6c8006dcbafffb +:0161109893bb0c5c09ccbdb3d1df361357d25f +:016120196897c6b41d7be0500f91ab93c8ac30 +:016130842132fa85c60eb5f09c6a8c3b96a65f +:0161408a6749fe574034a3813bf32b130c840b +:0161501d887eb776d82b8f85bd479648a3c99e +:01616043f3f2a0a7a26785093f61509a3483e1 +:016170c93e8703d688998b1a8618e9a9f76c85 +:016180637059a03a9e2940313793895a30a0d9 +:01619047e8952784473a3c9aef59f9a7b71465 +:0161a0e0a02fc9a2fbc94ad968054486224a30 +:0161b0b3c2fc93ebbeffedfd250b6e8fcf5c82 +:0161c0bb9092e7b699a8fc0975c486beafcb13 +:0161d0f26bd46d41c236a2417125ef360cd65e +:0161e07dfe19e639d2a34a2a23d4ec1fa215b2 +:0161f02851d37a4149cd6169c2e4f243710fa0 +:0162003f29c28dcd0efd036f2d5d59e822a329 +:0162102811ccab1631425a1c491d58cbef7728 +:016220dad1779a68d44b2e0f5f26fa248c9a33 +:0162303f6e985b41f5cacdcafce2404fac546d +:016240d588cc8f6cc12748c7ca82cebdbda4c1 +:01625088e5c71d6f124d70b466e399325f11b4 +:01626009b349290013f406690559c4985f7bef +:016270af87a3901045cb4cc5963d9b7d07a469 +:01628094f40256a10da066b86cbf0bdbd810cd +:016290667843b2bb8b23f521a375de32ae777a +:0162a07a0b456ce3aad1fdd31b873e2c8e3116 +:0162b015abdfa3c0040033a91bb53c3e6de76d +:0162c0101c6b2afc064caa0934d1b1a04da434 +:0162d0131b0bc1340a4fe5a8f6bf4396f1b622 +:0162e0be5975f7877f226b5ffb6dedbf9641e3 +:0162f048a25624ab4de3d9d667c11ed75e5e86 +:016300f3738e5812180c757260f293c746e9ac +:01631094566f9e0e37a562a5e83be79d2444e8 +:0163201e9fcb3b45fd57c80e244890475e19d8 +:016330d107752737c828f883b5e9246f39ae5a +:016340da10b9ca4777a8c038c031ff96342ab1 +:016350b650defbc9477911ece6b2453eb32526 +:016360b99bacec957f285ad81a1a58f836b07a +:01637028eb9383e154791d63d930de133d859d +:016380f8438828d8920e906f595e91f21c928e +:0163902f2fea375b13405b465e2dbcc48e2004 +:0163a012aa2048064a0958eb8e969e1aa7b120 +:0163b0e7b725aee00f8b7b15ae325902a47441 +:0163c0976f3bab4cec4f5b98f3c0f13ba2ee1f +:0163d0d75ec08aa618a5c4beaaca70f7c2ada0 +:0163e0f89c261a618c22ae5687c4913590d4aa +:0163f0383777f27fbb279aca2f7f0fb81573fb +:016400a7dd60d67ea47def2da99d66f8cf94ad +:016410c2ed347ac45a194908a0b52eed4fb577 +:01642096ae46ad90e7c2499543f3930bac33d2 +:016430c215714bd0090b221cd4d35da0d9290d +:016440a198155010a42373d8861d72ad8485e9 +:016450202881270b2c4e66b34d755bc3031ee0 +:016460e0dee05dfec23f5ef0512a74ff1a575b +:0164704b30fabedbfaf26a22aeab7998b287a7 +:016480df6dcbb300540aaa72e95997210b85f4 +:0164905fd8f1d25e2424111e4d218dad7653dd +:0164a0f1177c500261c7d096b6c0c2472fc449 +:0164b029419f7472df03dcce9841cae61b8539 +:0164c0c7666e42f5de73210958e3604090e287 +:0164d00188c25e7ba12c6644529ad4c7667972 +:0164e0a9316ffb5820347176ab10b5b9acea6f +:0164f06f82d99f48e89b3d29bbdcf83c515b82 +:016500abd851cecde7e9532381d1895c5fed8e +:016510eda5d746d194a25e47db868c74fb853d +:01652040f97c2d6311ead3d2984116b6f8b4a0 +:016530f1fecbfea54f3dd9ab3a78b87c33dfa9 +:0165406ccecd0d4319daf8999f42a2b4dec273 +:01655028787e7b552d84dcd2f1ae1260728d66 +:016560860dce46fe6d26feac3493acb6a4f54d +:016570a0e6a7c877b09166b9b4c5db490dbfdb +:0165804b5a0d367c9ef2ef0178c51c40c87002 +:0165901598c6ab341ef9322527b5360f332ffd +:0165a00050537e426c000b1f91413260458c0f +:0165b0a8b764203e83539318bdc256428f1316 +:0165c0860e7ce5842c6704c951c2cdb32c4a2a +:0165d0e114c85d91a358ece9a4062136efa23e +:0165e042423f086d2017dcb57a9b7755ee8e86 +:0165f086b89c1cd9b0e65a63a6604d3e9d6753 +:01660089545783024a765dcb0a4c500f8e1960 +:0166105333234b12cd3e39c9b678cec7776232 +:016620ec06c11242309a0b012b3a8bdf8d42d7 +:0166300886aa77a479792da3ead0102cac3035 +:016640a3460f79a268a764b394bb4f6e2a4e70 +:016650049ef02aa1a6773c4d42be7270e918fa +:01666072e5e0fe77076f548949bd9fb14dd2bf +:01667095ecddb1489044b6c2c55ef9f212b55f +:01668063ae00924fbdf2835c080e6c15ad5d94 +:016690a97992c6cc8a449c42b46aaeda5239d0 +:0166a0a1855cd5bbda8192aa931812a13a5c34 +:0166b0cff4bfeeed0791a3616b0ba7fe3d9fd6 +:0166c04699764b8c0a4da34e3ec941a47082aa +:0166d0b1107319c19a833c8611dd161074bb60 +:0166e0fb68c20f4eeb64a3598a774f0360edb0 +:0166f03f5e4cb4c6cadefc332e97749fa74445 +:016700e7a88902226101cf9c6559f9d4ff0536 +:016710b4e2a1b6eb0c4ebc67712f439a21aa3c +:0167202ab010f1342edf85140e1340809d71b5 +:016730d71e4ba2d597844fe13efc8996912c93 +:0167409f10b0f9544153153439d85fe37b0156 +:016750b4a415b4b9e47c958d52fdfc1fe2d20c +:0167608abed0683d522859a17b61a6c82b9a9a +:0167702ac0890e04d975561ddeefcb8065bdba +:016780801b9bb4d2499c20fe317cbb4a4e8b8a +:016790efbc4a12bd44ddf33884ea8c9d714440 +:0167a0476abf096e47eae7a06f4d870badb8c2 +:0167b0f3f6cc23cb37b51855629eb4e672c52f +:0167c0db34a0299b36eaf7d6c18d154d38134f +:0167d0ada636a614ac2d8de376fee4a8e2ecc2 +:0167e0c78366fc6b37c502170315a55291dd2b +:0167f002b425b0f88154154a3a56300bbc831a +:01680062db46b9d5d08c830d6a0a4e78844dd3 +:0168105ea409b01b5874a053060ae235e8f415 +:016820cba6736557768d06132a74c010f68fb5 +:0168304843d01af50d5eab2a206a8949a5d4b6 +:0168403aecc0624e33a1ec07504a34c3b20f85 +:0168501ba3f08febe5a36561fa6c07b3bf4beb +:0168600d6833050b4f71bd2c692ed3a0f70457 +:016870489a7b9e71cf8554c93b37e5ae324f75 +:016880b0cf0ebc56d1c46c790ec5f70f2f86a0 +:01689060aac6b693554531bdaeb766c625495a +:0168a0b618225cf5fc6ec87d69646c5e665b86 +:0168b0938a60f8fbfccc3c935c873300944ca0 +:0168c039f3bd95e33566659ac8c5b427b76ac4 +:0168d0da4cc82e92fb34108c5966d554358c24 +:0168e06225203ff8c7150b3193ed76a65066a1 +:0168f03395c192b79a00a616d65b925858a2c5 +:0169005a54c6623711cd59925e75c436177a81 +:01691061efdf0c53f5317583e2b48f0c2eb554 +:01692091ac12f453e50b80fcdf60374a55b1c9 +:0169302ddf4ba77aba7e0fb66c78c50928d3e3 +:016940fc56f887a4c3910d3f00787ed0965082 +:0169507b73f543fb25c35412db4a1a67c6c0ff +:0169603825571beabbe0b9ae91faf9a5b18ecf +:016970ced66c0447513903224176280e1045d9 +:0169807ef12be7b7630aeec24fc7fd5a857e5a +:01699026c7a35b96987b37e5a47440079e0856 +:0169a0584b17f879ba52f6b8a5f5c06c24feee +:0169b0773c3d94410396b52eea1ebabe9e2390 +:0169c0b8d6d537d2e090162c88e3e871904998 +:0169d000e07bd7cafaad306cddb1bc1fcdb334 +:0169e096ae742942b3e4f4992609c70527e881 +:0169f0e03bf6a002e15a4a8dd48d64d96f2b15 +:016a00696e309961bd6af215712cce0bcdb8c6 +:016a10cbf7d1ca800cd6fc0afa48b3b9278679 +:016a20058c513be20fb70a50a084a48bd51bf2 +:016a30d30940ade2a4bc68b3bcad8cdb8b38ba +:016a400af825ab134cd6058776d845a3351ed4 +:016a500e2b0974d5b5606660603cc7102d407d +:016a60223b72a75a3d306d7b47372c33f5b6b7 +:016a70a15f7d50688f31cffb653b25dc16d311 +:016a805879cac2d19c88886225ee4c9c58382a +:016a90346ee13374ac2906e7fd6e4b348dc73d +:016aa09a8348afddc805d276d7d810a60e9a95 +:016ab0f6903b4070efce638a133f92c9b99d85 +:016ac07c0fbe48e1d882a1bff52199bf06fd4f +:016ad0e6cbb57e9d6cfa84a3d1a907cbaad985 +:016ae0efa836492bce92d3bdcac4d3e23b706b +:016af062f2fc13695850263c12a06fe02823ec +:016b00ef8c493f4f0c509cb5888b2fc6d580fd +:016b10428242bf58367a203f10283191fd34b2 +:016b20c2c737771452fe8f630749a41b01c00b +:016b30a1c156536d6fe44018e4120f4a1398d3 +:016b408a14672af7d4f073f316a37e17124276 +:016b5030f1faa90a4269a4a77025717f4c427d +:016b60d810f587cf36c2069a8ccc7006cd34c6 +:016b707d2f5c17e3e15507d45d92fe9a769574 +:016b804ac42874c7d06109f02c61dfb52edfd1 +:016b905d11cb1c3eda9f61ae1879b660ff498c +:016ba0b0426742d170d3a0194d12dd240efeee +:016bb06eee975574ec95c8f73b8eda193271e0 +:016bc000fd8f3b96869129d6c029f1cb7e4717 +:016bd0441c1fa0b2562dcbaaa2c541450add8a +:016be09a0c78e843bd4020fb36524b91272d50 +:016bf008782dd89e04b3b4037b563545e4ad7f +:016c00c4c813790f68cf4dc086df3777fe022e +:016c102a19d29c34f7290ec95e06f48c5f6cf8 +:016c207602d810f335d8af00f3dbe36efaba00 +:016c30d80cb4c615ad20e8b5bbaa4957e893de +:016c40e96c2dfa3a9632d08d23c233ef7e7210 +:016c50158e26666cb2555bb1cb9e1e116abbb7 +:016c60def6bed7ca9a57ab8da1914ad63447fd +:016c70ce016d86b38d6eb542e6237d7d4410eb +:016c809738a33586ccdc494ba31fbb1e12feb2 +:016c90d167a5bc8ec04b82e852ff5dd4d55275 +:016ca0a78a99c5f7c5ad62c8c144a6a78576fa +:016cb0debd4b1f871843f0c7820b9647428e2d +:016cc0d19acd90fc40d28217deeedf27448b1f +:016cd0145ba52536def635304e001148561fa1 +:016ce07cb03a9108c5c3743fa1a2ad15de511c +:016cf01e884f8ca8cddc598e01af74a7f71daa +:016d002c6eb4eac77ddc191f501d611cfe9324 +:016d105095734353c3ca3e4db1f1109775a729 +:016d20016d2423dc24e55c28d1aa26d5edb665 +:016d30683fdbbbe46aef3580c6b2e5cc1576ac +:016d40ce6f66175613ce10f29813f0fdfcacfc +:016d50b30747a52c3d4211ed9df8ebf0b8ea6c +:016d6073d62a1c39e407264d9c0fba0c3be4dc +:016d7004f4990eeb03fd96e9f229471a13f39a +:016d8073dc5b4772287640522f1a491ddce203 +:016d9021e3fc2470adde00a7987eefc1a57f3b +:016da086334a8549afd97c166523b44b241263 +:016db0f6d3fd572075ee2d5dacb68034cf0332 +:016dc07413a1903cf0abeff1b643175094f8ed +:016dd0f029596f47b7c9e3378f57ba160bedcd +:016de0ba61ddab9fa356337b91ab1429197b9a +:016df059e823b06d5816de1e743aa45ce7c98e +:016e0041b085a4df1982c53f7799566c5f8202 +:016e1036364335138111609531ce9b40097416 +:016e204b514348cd75799c8e257f0b7a21d2c5 +:016e3097f1bf84595bc3ecc1a5a3afc72b22a9 +:016e40444b914547c55c6a1196100d680f8f48 +:016e50bbb2c905442fb67f75ec8bfb77be31ef +:016e605e83d75171b6ab74bc12af73b4876eab +:016e704373e87489b2ae66be5699b6f86fe18b +:016e80ac9e013d1aff3a69f3b2e93dfa5cb8d9 +:016e9028cdcfff209b983ecd90c812155501cb +:016ea02dfb3b134aaa5ce9e8992f0ec53917f1 +:016eb0328638c48e3fff7ecc039e0110d07716 +:016ec0ce7816f50a6f32bd24f76db47afbb861 +:016ed0355019be71ca011df8fb82a0375815ec +:016ee080f1bde64181f4d850e30019313e4b17 +:016ef0694392554dbe2a98e0cb1caff3e0de3e +:016f00fd923d711952ee10b9e1f3b46baece52 +:016f10c6fb2a3b0f12d484a35311396f2add32 +:016f20cd04ba2651270e14c9181a7748a25de0 +:016f304ff91786b9c9f777bc4c573a2f5240e9 +:016f40960ac23a608d3610051eb6630ee5a521 +:016f50923517a1b95118254375ab1c42d64448 +:016f605be2f3be8044eeb446d3f48f268123e6 +:016f70317f042d0b56ea5c343b1604a5832572 +:016f804b4c6560daa1a9b8a3189755dbe419bd +:016f90945bcab105e5925474424c3edbac075b +:016fa004736c3ad44882f44856ab8300a37df5 +:016fb0325c3c43b43445def2c293e19d72df84 +:016fc0b322d381c0d9e234c42ddb022d6298b5 +:016fd0e3f0e5c8a11bd60806bad3a758097fb0 +:016fe04d10ebfcdd7352cc40a4630aa82fe24e +:016ff0ad0182a2163ac90000b03fb28f2ac685 +:01700008c698a10e569d0dbf78f34e6c2f4771 +:01701008e1595b926dd093787ba9b7fb0d53c7 +:0170204e59bd95e2dfa0b61631b277129d3a90 +:0170307d63aa2a7a99c21696874b20de8325d4 +:017040f94d3ba9e6bbb9d41ef2f1385e5d505e +:017050269b3fc61bd00cf909a5bf1882cc5214 +:017060c95652ba077c3b9bb160e611c5b6d026 +:0170705dfa62182da294b0b910d24a8dd9f064 +:0170803850fc54546f29bc334ce8dfd9b45568 +:01709002fe20059156d072c6eb749d184c5a0d +:0170a03de28e7daeb126fb4d23ed32cf4b3fe7 +:0170b04341702c349eb43fc0de55a76e1a347a +:0170c077c9ad64ffc9015ccc0e17e10963911a +:0170d02938f938b903b17d610112029025e2a7 +:0170e038559685208c2424f195977ccc6ab189 +:0170f084c7bf777bea64154db3257769e5dd8e +:017100413209f464cb176779c28e303ed69f20 +:01711050edf1472c3a5f9bf484cfd51af6ebe4 +:0171202337d066e294cc7df646a1e78ec06ed9 +:01713068a8464548e2ae65267cdb5d999b21d3 +:0171400924745c235da3044afa286c9082bee4 +:0171506d844a202d715c466ae9eb3448636e9c +:017160c2fb88d431e6d130718d9417facdd51a +:017170ba797deeb20c2ccc69c83e43f332ae57 +:01718012fb26491504df454e06b1355fb919ff +:017190eff199d830ab7458ef81c94d8c1e9592 +:0171a04a7af8852cd5c95f5920945ddddff850 +:0171b0d076940422af28cf5db51ae33b242477 +:0171c06e3b8f1d108628e9d7aceaed138abebd +:0171d07ea3040d51d57c76b92e1a0a3eaa58d7 +:0171e0de9bb2cadda0bc3f5882a96b982ab81b +:0171f066538dee2f321601bd71ca5e13871b84 +:017200783d4562451ea8b1d407b68db79eab29 +:01721012c58e909d807727e0373cd3da8a8755 +:017220ce765dd1b3e4e6b8caf284eb32660171 +:017230dabcf1c516ac494647df6b99c0f01c34 +:017240026d5fe0ff62d149e30196f9a4dca5ae +:01725070758b4fb9ddb4565dcdf4868db59512 +:0172600bcdf66d62c148b934730255cbf21da9 +:017270cee50ab7e7fcf0a69fe5bbef62e2174f +:01728000e021e730d8febd881f1800467bfee9 +:017290d68776d6dacb88f0b75789f0e37b8943 +:0172a031e438f662a821b2870cd02f7916e32e +:0172b0632a780f1631be874b2ff37556ad8f28 +:0172c064063f10fa717ca8dd61eb5b54c36e81 +:0172d0a7b50b0a78b5cfb09c0579ae94b77d0d +:0172e032569cd11b0486e81c20569a237a0350 +:0172f078844169f141abf943ffb6a3e19d62ff +:017300acab18c32b73510fa28b5c42f8c132fd +:017310549a2900fad61428bbb334a546110791 +:017320243426316b715007dbb87b88e8afc4dc +:0173307c0dfccef2045e7a11fbfbe8f901494b +:017340e05c9062b13ff2978ce42ce1a8eecef8 +:0173501b42845d3bc668cd6f92f73257b5e359 +:01736032fcf298729c4479b9eaf4e951cabc4b +:017370e19304905793ea5351649f14465d7704 +:0173808bdb8ea2b9cb50ec7e137d12e93cf3cf +:0173904bbe2718f51d364e121af215c51e11a0 +:0173a09a1e333e77294ebe859adec22f2a3c36 +:0173b0247f7be7de7f49d7b83ebbb532228d36 +:0173c0df7ae9fdc0deee0a980e2428340d5683 +:0173d0c3ae5736d1b26eb328c5afe42d7b8b11 +:0173e0e581eb3eabff4b6be2b6f769ca8a2eaf +:0173f01744cc728a1bb5c56bca65f8da6b77f6 +:017400d8742dc3157a18c0b170c1844aaaf64f +:01741066f684af3e2441826708979b0d1269ec +:017420217ca294f0ed4240326b0fa3625b85c3 +:01743010d17df667d994693960282ce0267240 +:017440262c755f8011be6c4ff51f155c39542b +:0174509f097e8819fccafd9329ab26abf20205 +:017460cf23095e093d75c5f9b27725b0e83132 +:017470325931ccc14b2fe8ac8c8020aa3ff8ce +:0174800d5713850b91e7497361427e558fcdab +:017490e77d2108e4c9bb6f722bf8141f324135 +:0174a0432dbd975e8b673c05237a9f1e215bda +:0174b051d1629792359a304a8928e6c98a2aa4 +:0174c02f4b4172acf73034b8f80285d5c3f33f +:0174d0a6e37d056a587cff964671e2cfbbadf8 +:0174e0f3a3508862be1a01b7e240666e5ac15b +:0174f0294d48caf91c1052a36f3d304fd6fb77 +:01750029430310291a33c1c89b99a8310d10f1 +:017510d790de730b1a1799515009d4141cdd89 +:0175207ce23bf2af9552d3758479b8e9482ab1 +:0175308172dd2ef9e85428fd8b76a704195a99 +:0175408562e1848eccf3363379e0ad600588d4 +:0175508af64ef7c3c1dd33238dfb3e00489e9c +:017560d3b3e32b0ee6fc9cd82e6a05e6e16f69 +:017570fb33a2cbb65a8801b9a749ea8f263e14 +:0175806219251235d0bb3ab373e33bb4a59924 +:01759092e6a4cd15435292a24fe12ab8f330e7 +:0175a09d691eeae4449a6da5493fa7bc949052 +:0175b083cddcdebdafc1ef924275ec593b6324 +:0175c077705ca84f28457985a3a9dbfbe07d01 +:0175d0dec647f7ecd7eb88047e6847741d98ce +:0175e0405b87dbf077bfd5b8c94d9a2e9fbd7c +:0175f0f68decf77b237b4437ab6a10157181d1 +:0176007fa9082c019fa5b0f812d8e37b43de23 +:01761084cedd6c105b6f9e4754a76f27ca469b +:01762040d318c9232b3d586471bb9863c85a26 +:01763080bb8c651dcf3392cedb5b600524a0e8 +:017640806ad6b68e32f257e6d62f3268e473b3 +:017650f80a1131296f01b648c1adc1b5e4c36e +:0176607a035c8aedd99dea647769260c3b90f1 +:01767026c3218f1b61ee15eb857cb264197a14 +:017680d91e5f20d97d683e26f3b7058b98190f +:0176907910e5713c2f0c686030782e8dcbf4ff +:0176a018f85f86cd0b9851820e81d21710ab5f +:0176b05a615c8ca1bf0e900211c28cf3416299 +:0176c04d53b7a150d95011641d8167c6ab1bd7 +:0176d082172315d808dd0c58cea36989993fc8 +:0176e02c6e1e6e76624e5899e44850a99a8ce8 +:0176f02eb4a6cc79def4eced870ac0de8fcf00 +:0177008f330cd967c732609704c0bc4548a45b +:017710289d051709adc74755fa9f5e4d9d83f7 +:0177207355689f337a5c98456947f5ab44cb73 +:017730b8fbf4b53e0f25b70975ea6123993030 +:0177404ae70fba728f109eda719d1a561d9b8c +:017750d4a15a4f18197b0cc9c4bcb8a7e4a98b +:017760b0bb2e381a0369a66c43907080b1faa9 +:0177701523ba50607367a361166ff110ce7c6a +:0177808a6acd18d65b2dff2e9f86930e62a3e3 +:01779017f35ae3e37546e2bbdb42ed33cc58e6 +:0177a0239aec9b6169a8dd5de79745a527ceca +:0177b08b270e8df6a44407c124d122ada4418b +:0177c0225e4052aedc092b46fe1de7ecb013f7 +:0177d0ceb2a66f4ed70240c97b26bbad4a48d1 +:0177e02567d3146d1f881d06d3d5b9bf77f762 +:0177f06badbb3d5f34668360b9673dd2e1d03c +:017800321eee3631b1958862fa4a63444ca2dd +:017810ccdef1df3ddd83731093e19e9bd6b639 +:01782054a51fe239b4126c0c46fe3100ab146d +:0178300b341680fc900b398308e01454f068e3 +:017840962a713aade1dae73aceb7a7ebaa63c7 +:01785019c7357e6f6a6784cf5f4c5b51ab4046 +:0178601339d14cacd16dee8b797762cdf31683 +:01787064fe8701849283aa1108630ac5d3a424 +:01788013c93699e27c5dd3f84ea13f7c1d50ce +:017890b7d24f238ddc48d8a4ae0c561beedac3 +:0178a0a1bb56ba45ad8ab0cd8459bc3e9be4d7 +:0178b09583b1b788ae626cd834989ae77c43df +:0178c0356f16bfe9178f949cc00cee3a96ad51 +:0178d03c6cc6c51130f03f3413512f92dcccb3 +:0178e0655d7a3db0f2a2105f1182f0b9c1532f +:0178f07e7c482172edc43af4f95ad8b58da1bb +:017900fa772f5c448418a24a850834f7facdce +:017910e363388e6e0267094c29a24c97f08fe1 +:0179203a8c262a3b2842ef25eba1d605f8a50e +:0179307ab442916e9be14b0cb8abe238a9a7e0 +:017940363d476d9fce772a576e11d2274adb68 +:01795004d67f5e86ca7d54a36bf2437ad920bd +:017960996449cbbfe1f3e19e5514fca8b7ec4e +:0179702a2c167bc7225e2e922543145f4fb101 +:01798082f113d57720a619cf8ad80b920c48a8 +:0179900abfc8b9ad571b363c9d8ca278cf7af7 +:0179a0faa7b2a615293a8da88a4b56344959e3 +:0179b024957873b457dc77311bbe11c101f153 +:0179c0205872d07b9e4efbcb0df5c585e9052e +:0179d028dc20c44e08be32e8e46621a2315bc5 +:0179e0083c69649c98b2f8e3f792bdae3cd3b3 +:0179f00e75da18c7762f6a9bb9c2f3b2fdf329 +:017a00c22098a2287ddd5d103c94fcadfb697b +:017a10af1cf8995e88bf5f8516cda088c6e757 +:017a201c2ef09d646beff68c1ec4f15d1e0c71 +:017a30ff82ab5f6d11b6ecb9c4810514dfe384 +:017a40c0bb97e42af52f1785b167168354779d +:017a5051ec90d67bea8ab32ffca08a947bed1f +:017a6062bba2570fd1b2ec2b60657d2faccb22 +:017a702dd1ed7f00e94799ee0bc533e3d62228 +:017a80a6dbfe7e2a55ffe2f2f203fb90b52bd9 +:017a908bb6f3f67a50332e8c878887cada8a35 +:017aa07a2a71d74eb1acc23635f5f7d9f8d02d +:017ab076f4d24606b490b26f0b4718d07a3a37 +:017ac0893847319a293921cd1a26acd526fcd6 +:017ad0523446afd800453f466fa4b586870db4 +:017ae0d706fa3c26ce4f4d70ed6a3bba0063b0 +:017af0c757c8cd6fb3b76e6a5ce3c825910e90 +:017b00953c92b6a5b56c32394012dfaefd586d +:017b10c106ee6b3daf6855aa3abecf70e48b99 +:017b207ff48fa08190bbe694fac1fc8e87931f +:017b3012659398c8c37bee01d72d6165f612f4 +:017b40636c39f397e0fddeadacf558d990724f +:017b50402022e82d291cb499ed60a5353a6255 +:017b600c3e99c2c5aa966e071cc2693ff0747f +:017b70f48edb21b96caaab81c69576a16367e9 +:017b80fcacb3219f5d499cefbb182b09f5abb4 +:017b90263761b8a752650ab36ed2c4cb7c9847 +:017ba02d165e0d63a069805ae32d5a77e5cf5c +:017bb0e9b61e3018c0a82fe3a3a790947081b0 +:017bc0bd11e7ef28776ab4af3094164db0cfd5 +:017bd07a447619de5b13f361dc6ab0ecece4d7 +:017be0cdc4d526c9ae60877024b98a9e7f802d +:017bf05d67bea350dd1d7dd46ef0578d26bdf4 +:017c00ec1168fef91d3d2f07e5d49f4988a37e +:017c10868fda1baab25e00aca45a8eddd5179d +:017c20b10de88b387041481d38e62912b0cb03 +:017c30085a26f0feea0aa40dc3e10d2fb54005 +:017c405de969bcf0f619d0fa30b8ee7825da13 +:017c50526e938c9a73ecdd6a9d1856af754352 +:017c60b1ecbd8afa5380b751806ac4a370e5ab +:017c702894c09c73baf7f4f9a3444012403e0b +:017c800f841fa17c117d49973151fa82cd49e0 +:017c90f549d4a1f70d5a825b4ce950463a818d +:017ca0d845a32e6e78bcc10f903037ec19ce76 +:017cb04e1609621169b33b63f9aa8333a3c94e +:017cc04797aef08cae4b99171cdb3355b03213 +:017cd0d66ad8f90b9cdc6d64096052b1a5d8a4 +:017ce07b9cc4501ffcf735fbdd95cf8e1ff91b +:017cf067c04605b10bb1e768560cddc82daa94 +:017d00f20ebdbb9dad98e94af6bf4e67176b18 +:017d10a451632272c85eb40d67496dcdda175d +:017d20e8bbad3e5e63203dbb856d1b6df387ef +:017d301ad00acde3e2c36a4196caba027b0422 +:017d40ceb1f76109fd9defe782ec915384f265 +:017d5008834e1ff892fdc022d0d1e1723c25dc +:017d60f90ac62888a42e75dab55fc1cb25c51e +:017d70f7cbae6add70efe156f6f19e6b5f1ee2 +:017d8018f381f2c8e2845b1768536bd5eb4eda +:017d902bb690fd74e6f1faeba8aa2287fb482c +:017da07de465fdb37ca8db02670b61119474ec +:017db0dc1ae357581651bd179adf206e355d37 +:017dc0f9a5ac6e8e4213d90fd8d39e0dd106cd +:017dd093682d3ffc1b1617ac063cb6b747e27b +:017de03174d08e6eaefad39e8701b12c503c89 +:017df06ba80103d160b0546f4895c092d91794 +:017e00c36cb3a0a98c4e6928a82dc41d2fbce3 +:017e10efe22cd98a29e7e78cb12818e5367757 +:017e20175a8105fe53acbfbc0965fdad51de72 +:017e30d1b2246eceedf747564dcce21c3f4b92 +:017e400dd9c1e591780533de181cdccde603a6 +:017e501e23eaed2a13206296eba11c71ab25da +:017e604292c1d17b4d34c5a3b39e5b4d68a5c2 +:017e700c65cf7a4138d42b17ee99c60b722aa0 +:017e8086037b52476518f759208ecd0bcf840a +:017e90414a5bc701d662e0f02ef8121ae3f05b +:017ea08d6682f45e4cd23a675a520c51d344ca +:017eb0152f2b209a83e0e87ed183615113f6b8 +:017ec0b38b451a98116a57b78acd79e49ccf77 +:017ed0fd5a15a7d9e022f92c56d828b9464a6a +:017ee0cf97434d4606f8c898ea4ac2dfa4d4e7 +:017ef07baf67147866bae8f1df73a6fbaebf3e +:017f00fabcb629575a5f5dbfb8565333ffa8f0 +:017f103b784758564204666c68ee769313b00d +:017f20a25e6666e319c5475a19fbfca3f4d0cb +:017f309f619972456887643b60bb8f73854bab +:017f409d816fd5aed59605f38e44a3e0359b27 +:017f50a11005f2b0d160716a2b0d30e90e848d +:017f60d79e3b5a684a231c9f43283f19915895 +:017f70c8864b83944c395d630ede452bae331e +:017f80fdc732c454d248c9f07c6ca3349d1cb2 +:017f9044c9a546333dd623714defda901103ef +:017fa015283d89fac9d63d6dc3696da24792a0 +:017fb02d6a9fb0f8f5a33b90a74ae1b1269582 +:017fc063a2909bfea177f290d0a25eae5db101 +:017fd0626eeba4352bd097557677e635bf13b4 +:017fe0eed5fa2cab156ff9361e58123de02abb +:017ff07c3ee8e02c9a5bdeaed252d16de47181 +:01800050f49f207ba5630d1453391d735b8c33 +:018010d27f802abd8d965f72b44371d8ba97ad +:018020def1eb5ef76d9410dd71dfc585ff4ba3 +:018030b47dbb44ab42f32536650a014cb33ff1 +:0180402c0d58813dec748ece4d5c49da620079 +:0180509cc225346dcfdcbd4947f4e2e13a7cf8 +:01806064585c2c6065e17ddfdc47d4a04e9b84 +:0180708aa938db0979a6b664b59c522b46f0d9 +:0180805d464b48b5335b99595c183314160c47 +:018090e80a6d187aacd180415a7a8c39617686 +:0180a0667bb666a4618278fd7df2e9c80bdf9f +:0180b08e851d851a39caf6247dcd3f6ee1e34f +:0180c010721e126f7cd277a6adf50b55c32914 +:0180d0d48b2af36d5bd85732aa351c7cf1186c +:0180e0bf5ed28e87a0d52507e95d8fe035912a +:0180f039c51bba8a4edccf87c995f261c65771 +:0181000e31a7daecba7d0e2d4f7d32d8f0dc56 +:018110252bc6b88b5aa2e60e3dab0446a75c5c +:01812025bd014424f7d871f09e5b6e24298bc1 +:018130d6c3d4af698815d5ffb2395a3b7d87fb +:018140ea8791e132816d31c2e2baf4c938d33b +:018150f97d83fb103cf326a2fb5de71efd02d5 +:01816089890fead24d0706eb35eace12cd02ce +:018170f504de23af1d0c20bc1e6e4dc538f031 +:018180ae4e4182c1e0ac76960effb7e7794104 +:0181906f99aa153565e535cf5d9babca389701 +:0181a02749e46cb8e751ee83bc04f538b91c9a +:0181b0c40396145ed294fac2ce33611fddc0df +:0181c04a4db85a628d818633cecdc8c9a3b35a +:0181d0900389074da5eb55b40e9a7591d5e466 +:0181e08278630c0011ca63649c4246ab7d6655 +:0181f094cb1312e6caa2db66162915eed7b55c +:018200a7fd313abb96c1f349e76df63e64a715 +:018210016cb3470d93ad47a3cf26afb86d3505 +:0182200e878b0c17062bd79116c8959569888c +:01823087d551b62a9b98f8a7c2bcb15cc3f04b +:0182408681c8590e8889ca08328d6def47bfea +:01825029465b8d077f8acbbf36c5cffbf6c0f3 +:0182603557c898aec6028f51ec35104b518b41 +:0182708a35615f03be6ac68384b684c3885f12 +:01828097536312d08baf4f40e0c67e732eaaef +:0182906650dbef7449b0dbdbfa83effdd62b1f +:0182a02b14bd61714debe4d111718367bcc401 +:0182b011380b2b9c56fa75fe60400ac5da06aa +:0182c08907c98a2c337d84c0f28ab4b75dbfb2 +:0182d0a2d2506b5173327334c8e45d45226c79 +:0182e07201cb6b9b3036a79f21791df703ba14 +:0182f083ecfadedd5e481e083922623a593073 +:018300d31c87a9f6f99954c325193eba3afaf9 +:018310fbab4af72e862bda8a4b7a894de5edd1 +:018320587d8d4dfd0762863917a8253fafe0fe +:01833040eca1333804df611eecccb06df745cf +:018340241669596d41e2636406336535bc1e80 +:0183501f2a0aa8d599afc428dab8d3e1cfe3ea +:0183601a73862ce0ccf4092a82a6ca5c2fefae +:0183703d323ce7270fdd07e9282b692b00de2f +:018380625f7fb1b289c91b7a14a6f829f1e17e +:018390eb25be6618ceb1daeec0df47c3ed2815 +:0183a0218cdfe005a3e07a888d76d24620c38c +:0183b05c826170e42df2ac06f412e276579b8e +:0183c061b05086fbb2d7c0f7c3b1477e41baa0 +:0183d0412be0be76b3d1e2ff8cf26ab8dc5b8b +:0183e0c5e8c3f31883104236b75060c3bf7583 +:0183f0c302fbaba4484fbefc3df31b22fe44e0 +:018400e5e180de625899d7a7613ecef9a9c2ba +:0184106c1295b8c330a47abee263b1bbbd0b66 +:0184202ea1bd01322e32cbd4783ad6c92bfb14 +:0184308fef3f50df2c9caee921c99b200718a2 +:01844083fb9b3a9f8d7ff9807dd5ca195c7ebf +:018450c1749dde3dad01d177bdf03205dc644e +:0184607d58affbf97408c2bc59ed7488ffa72a +:018470a8821ec185b75fb267f17d8064de31ad +:0184800c5a64c67250efa1d70fb8952b3bb07f +:0184908d37cc9fa1ad81c33a172ff5ba9a1c64 +:0184a05f1432f3e87ca1dcf54700e80ed3265b +:0184b0bb82940383d7ec587c7987d07a223d89 +:0184c0bda9ec0c839cbf132b4e4853a8861a66 +:0184d03215e87e6788e53ce9f0d2cc08d862eb +:0184e007d45884110ed6c36a2bd33dba2fdb2a +:0184f0b23ee551ce25b63031732aa2ba0644db +:01850093758700a77cffabe667f2aac2f913f7 +:0185106829bb3a9c3929680ca22933c5d88739 +:018520c7dd0f19f851423c5e97512809975d83 +:0185305694d46a3550497fa2333df48f21aa89 +:018540fa44836033e54c06060c68e0a00aba57 +:0185501d5eb73537a73fad5bcba45b9db2d7ee +:0185606568e4cf7410b7f37401328b3baadd57 +:0185700c2e18127780c6e367a64b346ff51987 +:0185808f0bd1dc042471f5aa9fed8415c180f9 +:0185907737e149062785ac87ce6ca782d47641 +:0185a05c3a93b0010c4ed082591c86c873b0b1 +:0185b0ce20a542f818df3a40fd90b85880ada3 +:0185c0a6c163aa72ae64d6d23e789ced258b7b +:0185d0b77b463d481a39755ea4ec357f058171 +:0185e0735e65ba55532fdaaafea54e55596a03 +:0185f051254c39aef5fe31ee2d90d2cd7f2071 +:018600114d64d5b49637b8652b18a4d8744e80 +:0186100e0612496602807c0f1a4d9da4528c77 +:01862027c232e8ceb63fd24eabfe8296911343 +:018630784f35d9626fbd0af5c4d1f6aa525179 +:0186403b19511bdac92291da5e458b2701efd0 +:0186504a563417c083210a2c68b8d2aba6b8c6 +:018660f640ae124f32d75298e908b5f0e29b97 +:018670affa0a00d8dd2712bd69deb0e62a1861 +:01868006005650e70eac55ea5371e3ce332f2f +:01869027cbcb2b6c2f29b54ff1587cb51cffaa +:0186a0618e78555d2130a3c23600e1c487de4b +:0186b0cfc900d2978fe9811b21965ea2f5bbfc +:0186c0db1acd64490e2267a2ed7db60fe1f610 +:0186d0df62a33f20afa6e1930a476cce8b0d12 +:0186e0e9c7a85a16e020becc1a5d544fb96b03 +:0186f015982c7800353ddc011b726f9fa70689 +:018700ef4ccc3d2a9d74a3bf011361c147dcd9 +:018710417ba6758cfb6f451a1f1a1bac5ba279 +:018720d788c3cce2b5b64e09a2bb22a63ba685 +:01873025cabf82d1b3d8f45bf73582c8a051e3 +:0187403f62ff1bcb995f03beb6f8bcb250ee49 +:018750ea84b2b3aca4458c8320e3be8b2f4294 +:01876047f8bed7ca1deb41997f8a44c2b781c5 +:018770d4a050ea4f5fe3271c66394b1ce95b27 +:01878027f75a312855c07ff7081927da5153ac +:01879029dcc9d77d6290fd5294f1c86a1ac807 +:0187a028532070c7c3ee4003ed29f99b175b13 +:0187b0a0fcd4c5fc19a43d0bdbbdc2d65fc078 +:0187c0b8de06b61713ba30d2eb23cc9754a350 +:0187d04d06976d8d03ebebb6944248448e5f80 +:0187e0373eda0d32cebfcef6b17486d2fa71a0 +:0187f0bf188c8b5861e9fcc0e4520e90f0d14e +:0188004d6da4061995521a40d38a6704b56165 +:018810f9962ddbed1f2e43b4f56ec3ff0efb3c +:018820ea84de4fe21e44d0c93928f0fd070a68 +:018830e2420b17e91116c81c0c526602575895 +:0188407e9edb4af9feb5d94e9004fe9e510c39 +:018850550c8de85beea68bbbebd1875b7bacdd +:018860585a6b4ad79d508e8bdfdf16471c78d7 +:018870c8738f85a38074964e6163d67e0d5bde +:0188804abd829b95fdf5e7abb42eae6925c45a +:0188909936e1b245ec1211be640d3ca1109084 +:0188a0b72bdec969e276aea09c607bfb0c7461 +:0188b0edd9e67294e91205958565d7efbea1cf +:0188c0163e0e9d3d08c0dca7651cd82cca26a3 +:0188d056eaec6a20dec5af39daf56af0c07649 +:0188e0b57f02a99f58671221caf7b068d17028 +:0188f0dcd7c3323c64ddd0e5cb8f6f06614245 +:0189000beb5cfde621e2a9b49e33409ec110a9 +:018910b2d80ff7f06544d1e3a3cff13454a68e +:018920181b797f1f49534154e51952cb6ec3a1 +:0189307e81075401fab8bf8a230e88331cba46 +:018940e1228de284efa82e1dadaca5cbe1cc25 +:018950ea35c17f1a8299f70fdb333ac271abd7 +:018960c15a1612cb234a02df2cef86a2ea0e85 +:018970a36d7f54795409e388496a207aac86e7 +:0189803e81c13d72efc20217ce045749f1dace +:018990a030f85415f4924164dbd5132db13049 +:0189a0c84a1b5b9967fef3577882c4a7867992 +:0189b0f1f232231e5fdba9361dd0ffa6a4b2fd +:0189c063cc20db04cc07cda16904db735f41f7 +:0189d03848a4c44adad94a25179a1b1fac3799 +:0189e0ac8ee86c6ba7931228a1de8f3e4d6d71 +:0189f08c0ff45145a63802ab3a669eb981686c +:018a001b18ed274439eb8c4bfc07d84a596388 +:018a10577b63a370b21f77c757a41c77124347 +:018a20108c5207e887c51b475300e0c3e3c574 +:018a309429e100b78fb509dacd238455b6ae5f +:018a406622d6b66d51116b5653df5c629dc267 +:018a50ade94d087c4f23e910c91a81857336cc +:018a60df60c4ca37988343d163dcd94e55c415 +:018a702a1e1bdb96fe0102e52679be6a40ee91 +:018a80f26b0cb25c86c27c562e5b167df39780 +:018a90fe2ce9e48fa76d4b865c30cdbfb0b8ef +:018aa00f6417a3e815826130f169b2cebb527a +:018ab063d78239520eed86aea71b12e3bfe2b8 +:018ac085e42d9ee72bad2b68881cb87ad5a4c3 +:018ad0ecad32c43edab2a200bb2f247302536d +:018ae07df0c9e02e797df037fd66195db9f30f +:018af0c4fd323d666375827475278fe22d531a +:018b0014c99c7720819b666fa442448c221c31 +:018b106c90903ec36f7d832a15cf846a21bebc +:018b206168a4a8c839993b83aad21710ae9e35 +:018b30c8664cf2b9e90977322cc9788b5e9942 +:018b40e21bda2b1449be296c10984adc570d00 +:018b502712ae9e7fed155d1dd9ad308ae1abdc +:018b606fd487742c1b7136dfaaef38717c5c69 +:018b70efcbe104d6e8dd71b16d0e82fcf8c666 +:018b80bc8d64fe094c82e58d445af26391a175 +:018b90ab40e18d58fc2beab8daca526d613811 +:018ba0b9c4a6d57957973a3516061f7e244fb3 +:018bb0f2bb85b7383b0f6a5f9ef0e904f484e9 +:018bc0e03f92782235b83c8360271764b7514b +:018bd03fe1f7014b8cba2233c45f14e5cf1a7e +:018be067e99f85293440a09cea562a4ec7c52e +:018bf07f4f1027a186c8f9cf69fc04a3f18662 +:018c00fe642d79689b823160db9958590cb5f5 +:018c101b0dd37c78faec2df5d4333b18ebf9ba +:018c2077fe59d041878a7f8fcc994ad788f0f8 +:018c302e95b3132fa8fcae3c963609e64f17f6 +:018c40e208356e1b987d7523ea1caa931bfacd +:018c50b345a6678aac2081bb0c5197f18aedd3 +:018c606bd37c9de27a7a59ae0e14f195745084 +:018c7095bf1952a97032dc3d5b474edf9c5289 +:018c8041a2156a1c70d354b4e8387b46188acf +:018c9083c8801c4ff73306527ce4cec99630fa +:018ca0636ed4e3d3d3435bc5227dd3d369f512 +:018cb0546df581ae0be66e8e738f91d621a9ee +:018cc0b1ade709eb7f10ba5c48418e7970d0e6 +:018cd0d48b49016d1be412cc139edc4ab79b63 +:018ce06943a4538dc929ba498172d526f17f69 +:018cf002948eb7f86f53a8ba8963b808bf45f1 +:018d006ae1bf7d5d8f584ff017ed169db4a3ba +:018d10bd46169dda083d04d6fbde6fae438792 +:018d20a46149485afce7e396770e6890893897 +:018d30a91058b89d41aa289f62a8282ab8b792 +:018d4021fb3f4b1ae4663456b2b0df5cbc55a7 +:018d50acee1ca48fbe4a6a579a894deaa4c5bd +:018d6075f76d9b83cfe204ceb505ee68ca89c7 +:018d7055dee3efb97271e22d20b0609d0964b7 +:018d80b7f182d3c6cfe9254b35101be75d83c6 +:018d90b1bc8e6dbf882c1249622082fc3492eb +:018da0e449d76906c767c5723341d433d096ad +:018db099e838a5484bcc221ce2775e574cace3 +:018dc08fdca92346ee2c58b9e5c570ad5fb7eb +:018dd0da2fa1ae40a88febbfdc885348acc124 +:018de020fd6898399aad8bd64dcdaa59e8d02d +:018df0d653e7829ee6432c088108ae88d9c44a +:018e00a683290fe337a239a7ec552ad9719125 +:018e101b6ec57c4c5c46f4eb19a845bb10cb9c +:018e204b8ab1c70726e7cc1e3ac63d02d15afb +:018e3099eb1b65a9d97c5a645b46d7d9a24878 +:018e4030c1e2ed18cd49399f3461f4d5fcf531 +:018e50ee078ccf1ac6ba3f7f3e3de8385d39da +:018e609bb45807efe1cba44c22b283916b5755 +:018e700c9b48361fa7604a3374c65f86531275 +:018e80e00ee28ba6d283eeed41c6f87cfd8d52 +:018e90973a1888bdbef59ca89a062ebdd436ce +:018ea0ff4de53e81fb8688c3a51b236547ebb4 +:018eb04cb4bf8f16ce2f5ab9acd03905403836 +:018ec08d74b3c8c015e3351c37ec741894c80e +:018ed02d4d14658862f3f608309436f3aab20b +:018ee0241bf3eb9fdb4cef4db84cedcfdf2d25 +:018ef06bfd81d0749bf071051026584e81b4d9 +:018f00fdbd4b0c8c67bac4de6d8d7d15102bb0 +:018f10d72fbff58981458e13adeb8d51e6b0a0 +:018f20bfb6d68e18f1223e5509b2618d374446 +:018f30882e210700c7ec0394bb7d555497b524 +:018f40f4ec98d557fef23ae77dcbef57d464cb +:018f50347c904e2609ee6eed0e3450f9799e8d +:018f60873cce5668e9521d8025f2a0013f1b90 +:018f70ea8ca39b8191267a44bfb9a1795c1b1e +:018f80f3eaa4bfcf48bb3b52e1f2aed11da833 +:018f909b820b9dd6c98ea51515b887ed2b7298 +:018fa06fd50e785d2b4791121611b496061eef +:018fb0d5e17ca32beca34f1e715de6943d1e25 +:018fc0c09da0d361c1a18b97a30b6b122bcd50 +:018fd0df784656096ae0bf267ce743521729b9 +:018fe0ecc6f3699ec78ef0c33c111b22908758 +:018ff0a33ce97dddfc431e0b72c25a6f33cb6e +:01900044d60790cc1428d29859f28aac4ca8b6 +:019010655362186e5b64cb4abe29047804fabc +:0190207a2056290fc560af8e9e5601f6e2cc65 +:019030098d9c367d20d0f749735e0800538100 +:019040567365a4c276916ca902ff728bd56904 +:019050781555a1a2c339288026597e704c8269 +:0190608957bb8cb3e2ef2a52d2fb2f5847ff60 +:019070e203998f6f90990924e56dc2c9493788 +:019080188e581e751b15282ba03133d9b400b9 +:0190907b8a6ea1ababfdf965dad90b313000b6 +:0190a00b7cdb0cad66fd88b8e4b94072d6a2fa +:0190b0ed52623b26ddbc6655ef6d30e0ee2ba6 +:0190c027de671462d6381273e126a77e2349d6 +:0190d003fa63d6c08fd0f49ea4d2e746d189c4 +:0190e011bb82cd555469150fda3067093e4d26 +:0190f037b93e0894f252d637ca14ee2cfb4833 +:0191008eec603b0abb58cb2b431dd6344672e9 +:019110a475241843a860e9b2745c9d45471977 +:0191208eb5897b7804dc83f9ad057f41b53968 +:0191309586038cfa949fb8dc2a425b650057f4 +:0191406e618ad377b1260de684a5d90ba5c8ea +:0191508568c81871b651b11dcea60963fe1053 +:019160ff0a9b45774047d02d93f710a9a19355 +:01917053015e2560df6ea9d2bde138b96cc074 +:0191808a3a0ba88f33127eef7201d94e4dda0c +:019190fe81c24fdfeff3a3a0f12d40e28b74c2 +:0191a0bdef510d77df1761b63e4cb8da89c3dd +:0191b01a9cc3551d513704663f4cc4c7dc1c34 +:0191c0ddf0b7c4af51a93ca11ba8422c9fad2b +:0191d06dc7774039fafb85894ffe156f3252b3 +:0191e0686a280635d9dcc3265a09f4a6889b12 +:0191f088589d4e59e13eaa665e71055b74a223 +:0192009e35a6b2737b59815f9548a7afa8a3c5 +:019210b5c4720ef971ff1a0d0c1cadaa61f854 +:019220554e4ec5d7f8910b6efc45aa30087d08 +:0192301710a937de8f56e83e1b65e61dc60e0e +:019240f76920810c195d0972135cd1d36c8e9f +:0192501fcf25ae0b01cabdaea1b26a0a01263f +:0192601a7ec7cf502dfb681892404a0cd87606 +:0192706d25f69577b1e0f3675d487d057638ee +:0192806ecb9b496eec6eb3b2eb95d285b9b481 +:019290ef57f536f16070b430dea5b41906c28c +:0192a03e6ebd86499d374a3e1c6af7333341d8 +:0192b00aa2add1f782664864a499435d21a235 +:0192c07b7e4d1369d7f92ddd3f677c3a72ad40 +:0192d07685d1b3cd03737ed025764298a182aa +:0192e02bb849175168832629955d066a98369b +:0192f0ec3fe4bc4bc26c8589f68deb2cc46db5 +:01930096587a239808f48e6229bdf3e8fffb64 +:019310cbfe8e1e2f2ebacfa483f74b94e88323 +:019320170cd7cc2917971efd04cddc6c744ad9 +:019330df86b5794b27d8f7fd7130af931fb499 +:0193402796035d631d508a5e0029cf34b70dd7 +:019350a3fbab310096239526cedb504ad0fb89 +:019360d81836bc614ac732799b799bebbff4cb +:019370632e8ba323a932838c98b2b6e8c28259 +:019380a3f8eb4b72d4bb3cd4bc35c0838e73a1 +:019390d2a233a1faab038284aedc07627b9e64 +:0193a0652e54e71ffe820aeec096a0c64aead7 +:0193b068d317f8091f5ab250c9cba23b173023 +:0193c0f52b1a8a3a149fc369e3a300f28fd9b9 +:0193d03f983e0e630c2f2ae2737e7a4052320c +:0193e0c75d99ca371167f9ee81e56428e386e0 +:0193f0ed945382f2803237b080a12f415e3a8a +:019400f2d30bf79793e10a20916774c32f3db7 +:0194102fde9284aa48e663cb29655bbf658ddf +:01942069f1f75327ace1342d807a6bd821f6e6 +:019430c1dd09db775884bfb3cbc754b8519938 +:019440907651f12da9ff282b25fb00ad5af13b +:019450a9e339babdf6f730adc6304dd35d4457 +:0194605410c92c2c4d478aed1a702bedd127df +:019470bac0f6ea6bb0ce03aacb7dc4bc26abde +:01948099794a97f17ad87b260cf2fcec9f3c52 +:0194902c09fd98c2b36fe1233780ba038bbf3f +:0194a0348d9b644ccd6ffafb9f8ab5e2c250a8 +:0194b053391f51b5a4a4f0ad85e2dc38e67e8f +:0194c0c938d7782d6e6b795dc7ff1aeec992c1 +:0194d05e369aafeb88af2ace0e5e90e413a262 +:0194e014cd16bbf6db37475bcde7a521a120fa +:0194f07ee2a5e64ad2a76622c9b25d5aae358d +:019500e46219e92fbf1fc6962d1b4d0afc0849 +:0195105086884a0611f361d1b9705ba6492d5f +:019520b3e1cd73bc4227a3fb895866e5a24fa0 +:019530e6f7aa9f6378c84c24c643a95b4401cd +:01954094d6eda2c07d1ce4ffebdef6ce69d9af +:019550be76566ace9e3c27db5e675e79b38aed +:0195605ea4284f415a50dfb70587a2cfdea256 +:0195707a4e29a0d150c1030a8d966f2aef0c04 +:01958014993895a049dfb98cc80193a1f08c05 +:019590993203f7c4a907f39ac413883b7b5328 +:0195a0bca0454ddebd8893f8740195ac5895c6 +:0195b00494f9dc3d0030be5d0f8149d62bc618 +:0195c0f54c082627a8c808680696d8277314c8 +:0195d04a959922580abd29231b255c42f36ccb +:0195e08e19e43a60f4246e5098ecb8fbd796fa +:0195f0d42b8b5ca6c70e3656f9a6e06ab01a4a +:01960096e45d493a1a2b69662096934d1d7612 +:019610865452720d2c384cf048ec7e735f625a +:0196203b8b1d6e0b9ecd6fad02e10ccff4fcbb +:019630dab3b9065efe2771b4436737e5431720 +:0196402a0eb546973b225fab90353088199787 +:019650a02d56ce2b5693373a6d4e27448f3076 +:0196601489b33ce090b44fb9e5d319a988a1a6 +:019670878131720626f820f8e830f7f3a033e9 +:019680797242b1ce1f91e8240490866349df4a +:019690341c9f3d9c56d9b154dcefc12682a14a +:0196a0fdc1059ef78581ac2f09b9e740885649 +:0196b007e5b39fdb2f71602df3b84a6a4326a4 +:0196c02866d5ed0231b41636f171096254ce11 +:0196d0b63408011dbc76adaca7df4a8c185d02 +:0196e06e8e808e29f2cd66553c65b4d8d26566 +:0196f00728e0782a1ee4ceadfa0e962e52e798 +:019700e6eaa4d2e3e3a0c82a59d308d140a8d8 +:019710b83717f5a610a06c411ad012547df3b4 +:0197201380504c1028ea6c63a5ee8cbeaba898 +:0197304429b0dd3433f9b3020ed202dedebfe7 +:019740efd9b4470b31456013757837b5605ba0 +:0197503a5097b746c7a8fdf702824dcf8c48de +:0197605ac1fbadfb069c1fdcca5517f667e5a7 +:01977003e6694605e98a107999dbd9e7e27aef +:019780324decf55c280efa2389139c037888bf +:019790be3bf635c05478741f7f15739a844555 +:0197a060c7f514e25dc48d9801e663eaac1646 +:0197b0bdebe883bafa94fef77c44bbd4e97c72 +:0197c0003bdf44830ee03f35aefc9f04aaad49 +:0197d00c53fa4156230d5cdf943212f134fe5c +:0197e0e795faba476a291f64077f5f1ac49a63 +:0197f0c71b66936397a03fc181984c87f54f71 +:01980057992360cc17e88c9801d2729ebf7976 +:019810b70a58754ea5a078aa948fdbc9f1e777 +:019820018816395217e1e3c95fc1b021a8863c +:019830c89dc06cb1e19bc02fe2132c5ab51eb6 +:019840d62f36ed4393ec1a6bb4e6a10c547edd +:01985032f0d4bd122faccd4b364ec9c904f673 +:0198602f6013f6e76db6bc2af9e38b5ce44502 +:019870174aa6f3b8722ac5d3add432e1451ae0 +:019880a217d76dbfa9b7ab6a85f095019c5581 +:0198909b2fab945ee5e33c617088e49e8c2e5c +:0198a013ae81fa890d03fb9374590a44fc267c +:0198b0ae61230d34ee1e72ab601beb079d7b97 +:0198c06dc292546595259bf94cfa3e9a050340 +:0198d0b065992ca03ded4181cf63c5aad299b0 +:0198e03f58c9418abc4f8e843da5ae7e810ecf +:0198f008a439291354653af43324e191a6cffe +:019900f41bee6f37dd49d68ad05034b78f6a79 +:0199105f3b5b066ed641890c2062f6080f89e2 +:019920b8533ed525d72826815b66262929ef26 +:0199308a772e0ec9d5dd8c05e7158ce89ce853 +:01994056d6cda7c6ca4251a078b58463946451 +:019950727ac865756682f056e61bb1e74af868 +:01996033f04c1d67579abbdb150620dc58c8e9 +:0199704e6e94a384ab260866a252faa4720389 +:019980c79eb0ecdf07126ba1931d88b11ed70e +:019990bea01710d190ea01b1bbf9a2e42bd2ad +:0199a0d61d16c7187bcfd9f60b4a27c8db9bbf +:0199b08a58396d49f29d76bf73860c1525ce8b +:0199c094417a79df83234a64532261b1f1a461 +:0199d0b30fe060fdfab99069b0996aee292f0a +:0199e0d8188677194d1e42e095332c81f5a184 +:0199f0a69e9eaa7836a9894f1447a34ff81fa0 +:019a00d833c279fc6cddfba8bc17ecb72cef62 +:019a10156d32315aaa123cf5a646b7a0d06577 +:019a20f5dd2aa228305994aaf6793ac7d69389 +:019a30690069d04ed4a8b49eb9c866e15a17e3 +:019a40cde3d8bf011359a54e9947e4e64935c5 +:019a5052052eaae06a06bdb159e64504ffcacf +:019a60894e012ccdbddcf0eecb23c1fe26a245 +:019a708d799e5805bdfc545c1aee5540387753 +:019a805c05816ca35fdaa7e845b72af6034da6 +:019a908c5bd266d4aae573064a582e202e2ed8 +:019aa060a538e744ba98dcdaee30f5561a3e90 +:019ab053cfca19cd5fc28b1f147d22ac6d0db9 +:019ac09adbdba94b4b34b68dbfc125cbd93d19 +:019ad02f02eb801a246ee1d2ff62cec9b75782 +:019ae00f2628fdf5b56940f29b380cb4ff86d3 +:019af029b8e82eec8bb1177e2d699d6477b95f +:019b00d3d6077b32634397a036c641aba0cf1c +:019b106827cd4c6921cbe7c4ace522b9a054ed +:019b20ed8b320af61f1a263ae1e7abcf8783ee +:019b309ea8d1ca6fcb59c6fe6e06d024a6a2f5 +:019b40780620cb1f61c65e5a236028339684ca +:019b5075e14ed15c4a5ca94e0d9cf19ef66bcf +:019b608eab9b4ce15e144d8e277fc663af9e7b +:019b708eaf3b8b4f4a72906704d975046ad85c +:019b80cf315c8e6da9907314d3bdb15990fab9 +:019b9054c485b19ad67d074107e86042717368 +:019ba07f4331c4980e21ac4910dfffa6104a43 +:019bb02faa2c340495ce21cb675685096a8fc8 +:019bc0e87cbfe00c787cc0d489ba37250ba842 +:019bd023e1796415a4ee0c484443f37431f99a +:019be0a2b496951d5f8a44abd2276c3db8fe73 +:019bf0c8e48496bf59c0cd077a31492ee9359c +:019c00782e8a910af35cf2c005944e628f81a3 +:019c105f5c3c645f4de9d054cd2ff180423bbb +:019c20770ace692ab21b19f7104e6279ca298c +:019c30d104e3ecfeff5392e778a6c26f40ac95 +:019c405989b398baa188f080910e7a9323cc62 +:019c503211dbe709ab0972b3085abe392a763d +:019c608771afe919e167f16e44f448153907a6 +:019c70a80b610878e5afc83feef885831e554a +:019c80ecb772a274eb10fa9797e05324da7183 +:019c90cd78de56fbdfb7547fd85cfffb33a0d2 +:019ca0d4d9524abf0f36f96b167a3489d5a9f2 +:019cb0a3f3097a1bedd94bf663b387fb35b748 +:019cc02f4b6697068fca1591937a0cceeaa930 +:019cd084571e531264d4c0271eab937ca1e026 +:019ce06afe902c0855631bf5e91b653864ea22 +:019cf0281b7c7b0b5d3fff41cefaf02b8ea310 +:019d00ac31136e6906e54175d5101b9dd922ce +:019d10b236ddc0082c4aee19039df52e57c82a +:019d2042a7ed14cfe6d4e4d71d49c4dc339a89 +:019d30056c1d0662b9827f70c4790fba7c01d8 +:019d401f3ef817419e5825521594f59404db26 +:019d507222e8964d692ec2e9909d9485c0b988 +:019d60f2e7766bf3063126bc29b99e88940c3b +:019d70324e595b42360e21f1f9ec78a66322c6 +:019d8088d1e3c85100553ace5624d27f5db20a +:019d90d4ec71eae5fc15e9815a25e623ed72f1 +:019da0298b2755a0a34cf86df599efdb0439c3 +:019db0926490f54b9d80bc80f69accda500595 +:019dc064056e6d18b2370c70ab7387ab93a69a +:019dd043309bfb5570e69227763b9a1250b7ab +:019de0cf8b95aaab423580caa987e521319990 +:019df066dfcd414e78ca27f3aa6b85446ec731 +:019e007b7b9507b1d59d30a0f25d86c50e5688 +:019e108913388b88c45b5f923ebeb299317839 +:019e20759094350e8aa0d91f84b9a4b99278ad +:019e30335ebfecf53caffeb90a44ecb98f81e8 +:019e40bd1d420288559c0ded545c52208abdb2 +:019e5071bb2a400ed9726d03f6e1814b1323e0 +:019e606e45f3f179dbc58b0a39b0a25780b8eb +:019e70c623893b1a801c6988863bd9ca24a148 +:019e8034490e08eb4c6a4411de8085273d9a2f +:019e90c913f0007b1cd12781a965d7a014846b +:019ea03480afdd71a152b3ca2ac311f238fa9f +:019eb03e14ca280619e82d4c5642c51f7c95fc +:019ec0402067521c7a55849313b6f05fac082e +:019ed0f80733923cf4a4f6030943dc86a041d5 +:019ee01ea32a3ce71ecdff747d64b2ae02b19b +:019ef00b568a24ca5a0780031fce7fd16da859 +:019f00a698675f999d9f7a94c91fd5ec85dba6 +:019f10f84947811d047514dfdf78609de236f2 +:019f204703977324e75b77f58d994adbcf0778 +:019f3019e27842567a52e3bfea3430342f56ed +:019f4009a4ac57fc4e9e99a185a0d9d31d3c8c +:019f5097df43e276e7c458445588dd3f610803 +:019f60cebe14387f5e8f40ba4c5a09c1aa205d +:019f7006185f6bb5e49e066c99873c689ea13b +:019f803b0afffb18ba79c53b4e5d699e3a084a +:019f907df817f7554a0cbca3e7d3d4624507a7 +:019fa0074f60c20035d743770c3b95ab64d7a3 +:019fb0039928e3548b026c1f7ba7a28ede7a78 +:019fc0f2e68e10e2e6985cb3ca169304884e05 +:019fd09f787d98162860cd5595b84982cc3875 +:019fe0e1f1c5b8b1d76fc2f3cb4f7f8842d2e4 +:019ff0bc870fa349b543a6a740b6bde560f1c5 +:01a000c10d837e340957cdfe6fbda23a70c2fb +:01a01099cfa9dd0d5114fec6ff5c373b3af0eb +:01a0201b491b3ec880cb1b17fdc660e7c7b570 +:01a030db4fab38dcce168db8b3c47b66af357f +:01a040601f20335bffbd28d374214f77ebd55d +:01a050e83ab0bbf44a8f3b4ec76e912860fefd +:01a060877fb968d88f659cb7b8cda67c256ee5 +:01a0700a897bc42328865bef3d0bbd64718833 +:01a080ca9d1e9e415c434ccb59895cea5dbb5a +:01a0902483466676d7bfea93daba49aabe3ecb +:01a0a05447ffcfaeb16d794fa3253212455399 +:01a0b091f99ff96ca44be169487f34fa76c082 +:01a0c0e8bfa36ace9fabf26113f08db6d0705c +:01a0d0806e185cb83164bd9f02cecbacaf6dc0 +:01a0e05845f64b3d24d1ceaf6585821fee753a +:01a0f075a9dba3b68e66c0da81b28422b6d3f9 +:01a1004e90b6bc149ee9d1b614359464a73f28 +:01a110f5acdb2b1bed4313e62b3f237098fc2f +:01a1208f445e8422988b3b4f70155ca3869cad +:01a130210fbe56dd1b20d198872f1a1c0d803a +:01a1402f8c055012b07ad787f2ca8dd43eb5a0 +:01a150b5547f874b31516d41f602307f5f0e52 +:01a160a8a86e3d1b5aad3d3dbb643ce481d05b +:01a170c6ab86d61f817c68d292e3855282aa86 +:01a1800dc7f55b691434184f4310d155a76040 +:01a190d2fdfd844869fdae4d59975f2129e389 +:01a1a02284f746df7672f517e3bfd166cb9272 +:01a1b080071d8ed2d59e1ec61669cd3ba26e9d +:01a1c0fec8396104e2c08bdc540c9289bdf8e1 +:01a1d04efbe83c7f79476214cb7d861d3aa35e +:01a1e0158e12c3c5a9cb59b11fe81e4409c408 +:01a1f08b1d0bb06a9a03c494a70d5629d8de92 +:01a2004965a18d916dd20ec270d7665449818f +:01a21095b9ccd53dd4ac4b074714dea4db1b5d +:01a220e2a52702211d01753a19c7c454797582 +:01a2300054850562db75faf90aca1761b56dd9 +:01a24090a57b6cedf850bb7c43c3b17abae9c0 +:01a250d91f93ced4ee137aa05ca2523ea5aefd +:01a260c03152ed9c52a8baecfa08f8898365c9 +:01a27056703833f3ab6412cf123e626a31e3f1 +:01a280b585690e76bd892c8c2cac5b217fc6d5 +:01a2909b5d0ad2e11674dc232884c42bcdc09c +:01a2a05fa7709e6b4de04f15958204af19b501 +:01a2b00a920401219504f02adc30b16fd54d6d +:01a2c0b05a6137b8097c7fb31ea39370bd5353 +:01a2d0a4eb2adc44038a44fb31868f3d52ef5d +:01a2e0a12ac45a7713e11cd807f925df208303 +:01a2f031267ae95d31fbf43434583b918084af +:01a3002016114e3af43ae7926afddf4b2cdd6b +:01a31098da4b1c0b6769d641cbd9f3638d9260 +:01a3206f31d7f302a4fa49210aab1088c8b816 +:01a330f3ed93abe644aeffe3036316f8f52c26 +:01a34022ac8e380ffb661590f86b28b5ebdc5e +:01a350eaadac87a9547fa2137066a9dbedee0c +:01a360fc2bdadc4b0a669a5a6b67956dc4d497 +:01a37072098d5276eae2839cb638480117e92e +:01a380f85cf477841270669e64f42757e1c51e +:01a39018c04cbb0c5c9b9ee0ca3bcdc3d3c4ee +:01a3a07b96a41f6aee7e12fdcfefecfe64e96a +:01a3b071ac8b4c78ef5878a1e86ef4bd108024 +:01a3c0e74b3140a011ce2619886b1bc69d0744 +:01a3d0635b5a44c1296fdb9bf972bcc69e88fb +:01a3e0cb58eb8dcbfc3c2136e0d2a3145a3f7c +:01a3f0c2d2840b6880ae31f0a67612a00d390e +:01a4001ed75aa05a83a35d4a96f96db118a1d6 +:01a41041755bbc571959998cb88f52757a349a +:01a420c36397f5d13c822a29662349a9d5114e +:01a4305bd8257844e36ab0c12421076961ac67 +:01a440bf4643c4820256b6e717f39e231c1d6c +:01a4508e22a3ddca85098f3db7c81ab392fd8d +:01a4609642d40ff48efddaa6f77d60e1b1a13e +:01a47015555fab97eaee8ca638716eb5bae0f3 +:01a4802584e73efd1b3d79829fd20ddb0226e7 +:01a490d6b3f3e4d8a3b723ae9cef458893eeb1 +:01a4a020d9da05eb32a5ae9bc971c470020249 +:01a4b0bd35e208089da4838086f8d3468e75e9 +:01a4c0c094de6e140de422d00c5bb8d8743d6a +:01a4d0228534eed7c14e6f2316c63bed238267 +:01a4e01367c78574a84696df80678927eadec2 +:01a4f09bc633ad81b2fa8436859f06d88a4e2d +:01a500bcd2202d3f6647767e13314c070468aa +:01a510bda2c283fb42cc85b7d1ea526b3f8e72 +:01a520716c664432e5703507f7ddc29d8fa04a +:01a53003e0e1620ac7b662520c5acc56d9f80d +:01a540f5a2eae62ff9486aba331fd34bbb120f +:01a550eb77b9766c88c50118f665f076d741b1 +:01a560cc9a72e3ce4c1024cc92c9e1050ee99f +:01a57020845016e6677f4a52a24c36e6b0acee +:01a580f54544bc7feb81c556b459b075634bb4 +:01a590713b0a69cb2fe63661bd59b36d023324 +:01a5a0b8dd7403fbfa1ff54c1300470503ca3a +:01a5b0dbbb3ec7047a7e906340d91f25fff2cb +:01a5c0dbf0d7c0e7e0e6daef4d92488fb24279 +:01a5d0629180ec922d6707992ba583c1b73e2c +:01a5e0c89b3f01c70c1b5f40114c2d59b6eb36 +:01a5f09d7e7090a1b9edd63baa4b92816b6559 +:01a600b9edf6000489f3fbbecbd895586e6158 +:01a61099e77956ea1834fa005a099c8b679dae +:01a6200ebd75906775dca937dbc5628f7867cf +:01a6306ae0b600d6631feb1217093a7b6eecb3 +:01a640a5d464c56caeb49ac9882e44caca2be3 +:01a650c81a5778b40c39479e167136c325a3b1 +:01a660c41bd45ecd8870cf32e5c6bf580e68f0 +:01a670770e28f2417c0cd5ba30472951f84d5e +:01a680cc0118baf5f9845d41fc83fefc74e444 +:01a69069051e5426d55af28565fcdec9a055a1 +:01a6a0629f7fd2ce3b00bc4666a0f380178ba3 +:01a6b0b91af99fac4ebb0fe8e3bbf02cbf0f52 +:01a6c01717a6d69275888981ecba6054097cfc +:01a6d097196230c592a6bfb25f1c66966aaf52 +:01a6e03246718eb2fe6d41109aeb6a4fab468f +:01a6f01c1049d6b82ad1a9f8f8943aa133e3bd +:01a700a60e481f5d7913f2dd4fa115c962c521 +:01a710f14ef0b332ffc54ee6f0d57b1183e947 +:01a720f137919ccdf5814c45e42c9fc6c1cdff +:01a730bfb4361aaa4dfb40294195ef5b58db2d +:01a740aeebdd5ebb8dfc9c5938f9b02f73cd3b +:01a750385d66c263ea0ba910da9d20cedca770 +:01a760eedd942f7618e854ce4851f9c1c116da +:01a770dbfd057e087ba30561abee84e1a9897c +:01a780291761d618d173ee6c882aff176585e9 +:01a79019c7017a49710eaa9c9bb4a856a0e744 +:01a7a0e53b7b2e59fa8039653fde75239a143e +:01a7b037a9ac473ab4d625fa2523138b1b54b6 +:01a7c08dbdf1f150cb99c6bacb1302d6cbf9ac +:01a7d0827bd5812ad703f56149ba933aaadf03 +:01a7e0b7a1c1831a2d73b1ebef95c4e469a9b5 +:01a7f0f980aaa56dccc19a0977c5483321f072 +:01a8008a6bb35342740e05f65546b110af6886 +:01a8103659981a7d845dbd1214c02e37eb1492 +:01a8204ebdfd0665208debc437ed0a4fa57f78 +:01a830912b93ad6723096682067aa0ccc7b470 +:01a840fd8c429dc9cb2831dc4fd594965c0ed1 +:01a8505cbcb70cfbed03649ed16c606844bd15 +:01a8604398be8ecaa19aa432f54856770dfdf4 +:01a8707e1c8dec06b2243924bcc73b91fe1d5d +:01a88009a20a5228313ff8de6a8952edfa7596 +:01a8902016157a3b72d862ab7372cf5bb7ca73 +:01a8a03f97056598e860e45ca1e8026194dc6a +:01a8b0057d013789ff88408b5f8e851ba71e09 +:01a8c02fca8ae32404ec48e72c7d3bfbcf08d8 +:01a8d0a712deaf78aeb47b0dc8ae57e0f2f5fc +:01a8e06b5e43984366eb7438bcaf0e645e1c13 +:01a8f09a42401bf99a8fd60381f70b45286d81 +:01a90049b39ede321dbc4c2df22d12f987e984 +:01a910498ff3d2e48adca05216102cf9d7f1b7 +:01a92018a1df032f107f097e2b75963dc51da2 +:01a93051de2f728fd2c684b45a0057b2805643 +:01a94013b60b1d958fe8efdfa0a898c0db08f7 +:01a9509775138e4f54deece8b3ba74e5e025e3 +:01a960e8f1c058e9050aa70929bcbb02fb9c7a +:01a9708aa51fcd47d644f29f7048baa331fc98 +:01a9808a7262d9b32e023b2527a5a86a1b3853 +:01a990e01ce374b42ed36e80f4ad0d0b81dc70 +:01a9a02e5bb178de150543838fad270ca16a0c +:01a9b07f9327d890f308c91be2f853ee9907bc +:01a9c052203a40a6cebc903456918820012ecf +:01a9d0a374a6a5c1cc7aa62bbf6815de4daf7c +:01a9e0f08a3eeb88e918c36f6d9a0d0022703f +:01a9f0c83457c0fe26c9ac72c5f0e6cb007394 +:01aa00c61ece627452ecdf6cd06261b62c0e4f +:01aa10eaa92ca68591b2a23ef545cbc0f7bdb6 +:01aa20c0fc2a3b718d84e3d95c72ae71b718e6 +:01aa3044531da867f3ee501bac13df42efa30f +:01aa408f7f1cea740f80326e54d45f5507ee62 +:01aa50cf6499141f19bb0b7f6fa201ec92dc54 +:01aa60a444a06bca84e40f1a7fa122124acc36 +:01aa708da625a60c602c3148ebf7e2790366f4 +:01aa80f1af850ebbac1d43fa4e31a92d3f7108 +:01aa90028f788b62b16906411e623e904857c4 +:01aaa028f8af66dd43ddd9032431154c3dfef4 +:01aab0debba5857231d25ee68fed4b1dfc304f +:01aac0eed74dac8422d103bcb2d5b29c09792e +:01aad0a60c022f088ef10089c10d0f7a9f3aa6 +:01aae0f1eb5e538f8cbb0b14e7a902ae48e273 +:01aaf04f801c01bfbe6ecd7809ca9eb7ff7ede +:01ab008b59247193a35a7348b2ec00ab12da05 +:01ab100fb6da4a4329c2219aa08ede43086d0e +:01ab208432da30a968b283541c3a2a0a11873a +:01ab30908b2b25bbe4074c12e40efe6b4ea6a7 +:01ab40f4905fd5318cd6335be19c7bc7025190 +:01ab5015e11f695cb1aa6d07f5779a340768e1 +:01ab600bc0516ac39f4ae572523b9d577fee77 +:01ab7037b0e877b9b7ba1916a4a3a85896a4c6 +:01ab805706616959e3d83d0c0957151d9ab270 +:01ab9033589f14cf46a44622d5c0d270e47d9d +:01aba081b369ec453c051773bce17203c3c76d +:01abb08314f92d80de4dcac3ae2352d1d7e69c +:01abc0c9c921d39f79896a0832f695879c102e +:01abd0d06f0366b5bcc7e4008ea4c77766be82 +:01abe08df85677f30d02dc1ede1efe92b6a3f4 +:01abf09bd3fbee0d4477f46fc5e94d75ba9e38 +:01ac00835cedf65e22ad3be21a542c2746313b +:01ac1048fc6ec34cee7400dffbce106932894b +:01ac2071d8340c8c07dc57b74bfe9466bcdd4e +:01ac304dd2c21d5b9e4f91b784811f5a25432a +:01ac40b93da6f3bdf72eba697a2d68d2835f9b +:01ac5045c9d119ef7b412107b7b848c9f6fd3c +:01ac60bad5c163f8fd92cf44db5330e14d6d64 +:01ac70a869810f0d3aec1908dcce88778df906 +:01ac80617d2288e552d003563b80f935e40902 +:01ac9033f8139ac6398b6af64379587fa4e588 +:01aca07eb9cdd79bad519a2229883a1de76329 +:01acb0293b900a0987462b64355d48e1a30181 +:01acc0169d8d4c916b41ec317c2f802bc8bba8 +:01acd0b97caf28e9d793b2b0699d6bff0faff4 +:01ace0db62f1f53668eeead97d1f7a428b75d7 +:01acf0a4056dd18f2c1ac94a0d91eedfe9b516 +:01ad00723d5c5930710cef2743c5bde25ff55c +:01ad107757bcb74ead6034aa8872d1c8cbb1c3 +:01ad20c72c3000090c836ae597ece4ddb002f3 +:01ad30ab4863ab6179bbd1a42afcfa51594234 +:01ad40bd3b3eb15b97c4d35246c5859af591a3 +:01ad509a7cdaffecf4f4f807d63a561e089204 +:01ad60930710337df0350a57232335e14fbb0f +:01ad70ce60e4c6174f20cabd977bb592b57b9b +:01ad80cc6c6087ccada3d3e6144075897fe668 +:01ad901181e367a18a1ff9564f11e271269bcd +:01ada08390ee71a867a225ccaff57f874f730b +:01adb00155cbc236886b3ee827e3574283b36c +:01adc0720695a84e2e7cef511d553e7377be26 +:01add08894b023c5dd655b59cb0c2c1436ce27 +:01ade0105507cb6e984cc2d55bf4ee0adf0dc6 +:01adf0817cbf96da7e9e929a9dea6be72e8812 +:01ae00add8303c699ba48b7a0e283780b53eae +:01ae1079be7726f9a9f531389a8696fe53a1b7 +:01ae20845173278dc5129b07089173af89e56b +:01ae30fcab03d0c88cc61d26e6ec44717e238a +:01ae405f859b93e88923e7c3a15183c4f1816f +:01ae500e2dd102532623a35a0d2127f39d2142 +:01ae60a223e86a0fd20cf2247dd0030859cc55 +:01ae70598e792dee5053d792a3e815871156e5 +:01ae80c6098c9079ec2738dc4016c43fb409cf +:01ae90706a48033391b2aea5d1beb30b7bb1ce +:01aea09c1bfffd3f98769870089800eb861cc9 +:01aeb01b27821b9f996fa97addd6cc558a734d +:01aec0edadcb6f06ad4fb2b754cf93b4350482 +:01aed022b64d12df469b1dc168be4a4e0b237f +:01aee0b7670238b9bb196789b1d4023c0eb10b +:01aef00c0b04d93323939ed384c63a87d9e6ba +:01af00ef4c786353e7d171b9c1f3be7968aa77 +:01af10842c926633c2ce880fac23a9fd15b306 +:01af20b63481a89212c874abb9f3bfa76b8737 +:01af30271927dd6ed0285bf8ac37a30fc7d5a0 +:01af4094ada6e8ca61d6561cefd567af23b8f6 +:01af5032a421c62ff1a2e74ceb4d88597ced76 +:01af6019c0addd595195d74ce3dfb02ff0a780 +:01af700c4684111f2df71f49756abfe3742256 +:01af805558a02dfbc43c70a086c25b851aa3e0 +:01af904d92f6f2c1f3cc354532905506ab4c54 +:01afa02f47e94bce75396c40edec7648cab110 +:01afb0be13b4ba8b80c9dea2ce706aa4fa368e +:01afc03cd7906e751699516292b838813d188d +:01afd02d7f14c7fce0e98f79398357a567d3a3 +:01afe0bb51bd0fbe2715673f2f57b7295b7942 +:01aff0dd7c4016b8f8bd2d3b9171af6b2a9eb3 +:01b000c2d0b08f0fa1de64b9f319528a64e170 +:01b010edc147cf214327f6cdd93ab05816adbb +:01b020f2937f0de98044b2d1a9def3d1a3c692 +:01b030783f66244a16557788b13d2c137431aa +:01b040dc8ccf34b752b93d0127e91fc76ac92a +:01b050375cd402e64f60c0940e8d435551acbc +:01b060cb65239d0cb4f95bd223c2bc6bb7557f +:01b07059a2ecefa5ef2c38308bc597065c1bdb +:01b08057ef7a362d50f74c45cace8a88ac9ac1 +:01b090cd696813c40757f4edc66208b398af02 +:01b0a02dabc237f719f9342bdfb02415add7ab +:01b0b05bfe414d22b741f3d30d111e722af7ff +:01b0c060a7e6f1b6a90a1d3ff5f8cc2c7dab3a +:01b0d0c3c6e71635c6f01e56b45b9124cf4751 +:01b0e022ededab035556acdd227f596a9befa9 +:01b0f0d4e11bbea3dad66fd4f8ced41a2e89df +:01b100d218ca53ccaa1d6d7508b59f96c4d940 +:01b110c7430ab86cdc196451ce3eff6a9b1fbe +:01b1207b1c9774012252f4053c9e4f56b25ddf +:01b1306f579d5ff4dd8780cb8eece20c574bef +:01b1403697ff877a43eae1271b4a8a98005fa2 +:01b150508d2b50bc9d26a88af6e60253bdad3d +:01b16094926a06d2a307db80c3756f2170f2a9 +:01b170aeba0af04d47be6540adc2c7c252b598 +:01b180d5e1cde00d5087414f1a82c8b372e014 +:01b1906bfdd193ec6292ea9cc5c2e52df0f96f +:01b1a058970721a80da107392df77edf454a85 +:01b1b02884773f2d94994a679952b9b214a903 +:01b1c0d6a990a78dbf627a1a420798ad803089 +:01b1d04db23fd6229fa243f5aa72846b2365a4 +:01b1e06dfd450b419185ac99cad268bafb9a05 +:01b1f0c8e946a31db5ec2354e21d717f036c34 +:01b2003bc98de07291221d9d79c034a3e3dd44 +:01b210e6d5634f319d329640438f82b0958fd0 +:01b220cd9537a7fd6dccb54e875444dce7440c +:01b2303dfd54084ce35067dcf21f94b284c034 +:01b240a3b941749196255b254a7a5c9558ed18 +:01b2503352036be4dc304a9db763c9cd81c863 +:01b260db5e75d6d2d44f924aca301a8de67866 +:01b270c2b0a3b6a3c5d0f30dd716ad0ef63e10 +:01b280cee08489086e7eabb2a99f5e8db242f0 +:01b2900203ef5555a1fc452d08c1867a11fe35 +:01b2a025651f38377e0eedeeee8959a6ac965b +:01b2b0cfbe93e65cea0bd7407c9fa8d2f98adf +:01b2c045ed261ca46997f3fe04d6a304aa96c3 +:01b2d0e3b4f2aa502c1eeeaecf0fe51f935ab7 +:01b2e05c4815a6f135408f6abfc9b061825966 +:01b2f03ea01a1e295cb0edb2bc401fb8374f02 +:01b30021c25e806c4b708955e9fd6090b68106 +:01b3102c1bb8f7d13597a8aad5de3bd21fc7d2 +:01b3204b2cc0d947bc4f63348c1c2bbdd8fa4c +:01b330f94ada2b80b869ed327460e2f51864ff +:01b34086c94f01925b64180da0f750b5488921 +:01b35052f411d1e137f6ceed873dd506161cb1 +:01b360b7beff3f7d8db6d2644c809d6e07c8b9 +:01b370fac2c9b8a9d54a6a807301d6affd8773 +:01b380d391169f629da81bae62272811045061 +:01b390c6e1deaccfc25846e291e401bf7fd23b +:01b3a0d05c89954721a6f0b2cd1e543ef4d241 +:01b3b0baf813864d09e9b88c66a9558a60ada5 +:01b3c089af601745356351dc9f4807ec48deb0 +:01b3d03c39b039c4a1fe3ddca9e9eeaf81219f +:01b3e023939beb8869278e49dd93adf3db4720 +:01b3f0f8422a0baccfb6b9352547a86d92c394 +:01b4003bfef60f85e73a20e1f1b717f29aa9bc +:01b410bbca709ec7924170738ac076cf7de8eb +:01b42018e1ff1be72fac4d8d13691bbe88c093 +:01b43041b077d7d94a09524c4f31150d2a9c94 +:01b4409ba261eb09f891cc677819562f1cdc6a +:01b45000898286499e324e306f7754efda8d2f +:01b46013f788779ea41af968b85f2e2ffe2b26 +:01b470ba12706c7f3c62c40ac58a6041aea0b4 +:01b4809e5d90576df90e7805a960f688a55bc2 +:01b490e25ea561042dfd2d2cb1448075d4c4c2 +:01b4a0be117f15cdd7dd0beda07f23a362b29e +:01b4b08dbe2fd62b174d6ad0801997e85b060f +:01b4c0459f916156c0206197b117036d6ca228 +:01b4d0a2d4affb2dee3a9c9d72e6a3725861cd +:01b4e0912e457af677abb194c4e470535b272e +:01b4f002b1f1944e6e23508d5fad6294f46ce3 +:01b5006466439a2f49c11ac1305b0e1334fac6 +:01b510ddd27f3dfc8430ac0a85f23ee0f2c538 +:01b52048729968cbb918123195c7088f587ad7 +:01b5300641269c8f688631ff8e446d6150fbc7 +:01b540f55a645ace24ecd1c61528fba9a57fae +:01b550c4e482eff8321caff9b4241a21e2ced2 +:01b560192e0c7577bc1fbd7d4098f5532de085 +:01b570e904b07b07964f260c3d5fc3bfedd85b +:01b580d1a7c308d51a5ef769036ef3a0a2de5d +:01b590d09ec5ccc7b1097d56825d367e0fca8a +:01b5a0c5fb35b1e3e169f06b727534fbd868a1 +:01b5b0c814401d227eed86afdbce05ad61a06e +:01b5c0a3d3936cfc62fcef49113783db94c511 +:01b5d0d7370b6d0cdb8d5dcbc99cc2571494f5 +:01b5e069a38b1986a5bb0884834e409e3ee974 +:01b5f0877f1369f4d09d9a7051a8a5b544c73b +:01b60099cc6bfcf4a2f6df49075ca3282d2197 +:01b6104a1fa285cb8d46dac8b24b7cde7e2bdb +:01b6204c5ecbacabb129c50ba99433b64bce3f +:01b630067e68066bd4899825cd26e5c118a618 +:01b640e3c2d064589043e3c3265bf61869ecef +:01b6507d84042d5610e141e5101cdcc85b40c3 +:01b660ed49b0a3f3d3534e3cf4c146694cba43 +:01b6705f477a4ad51ec9d188d5fa1d0e183f92 +:01b6805f6406f3fb25e0557152f8d616318db2 +:01b690692b50f6c2dedf9086fc7d1d3eca05d5 +:01b6a0764ccf7e3c9d4396bd7c9ad8223fdbec +:01b6b0cc046f28024731f1d505d5426cf9c03d +:01b6c0d1c2d5e03d22ebcc75e47d857c9718b6 +:01b6d0153c8d6cba627f903ac040af19b7fdcf +:01b6e0a8fc5f30425099d1cdda9a6ca3b14d41 +:01b6f05f7bbd19f0f03d9715eb0aea33faa6c6 +:01b7001a16eb68365914d49969005d3fe5ba42 +:01b7103ce74e5adf17ad5dc88a8ff09c54a9cd +:01b720f9b2b7073a43d62eff49c07ba579173f +:01b7303e6531eccdfd375e50f6be87600242f9 +:01b7407e327eeb7239683c063d5052e252dd7b +:01b750c27b6a574e775f181b3eaee694ddbc8d +:01b7609c4a402857ee6ececf035236935fe7fa +:01b77032460a9dd68a4fd1b1c0f9390023463a +:01b78032a37462031989a5a8f02c2c95cdc891 +:01b790c2935e23363e254c6ea5f69b68140f60 +:01b7a0a5bebb5e10063cd738f5682250d4d4aa +:01b7b06bfc894eba0b3adab8feb34fba10962f +:01b7c065c21e0e73d2ed24914481b4a21aaead +:01b7d07a0355aa634a1d0a333512fb48db63cb +:01b7e02634b293f3d250338933ad535adad857 +:01b7f0c8b67460ba5ecbbefcba7baba7a51405 +:01b800850653d648a99c36d8a3fdf7b711d56c +:01b810b51bc0c55e52c7f2e9454771c0bf2dc7 +:01b820b036bda614ed7b7c53a0081427e8fb8a +:01b83048c4da42f4cb8bc9a2c4c46f219855be +:01b840765a16e2c190a367f046ac965d789537 +:01b8508bd75baa2b4d12b31be990fbccee5568 +:01b86085aa09c3f018f8140c30d2fdbf199834 +:01b87096b10dadb26235b49e58c66a1f272ac5 +:01b88035bfbf17a5153a2ca7ed51e8ffc96623 +:01b890b61ca601ad259cb0eb6c705fa048ebe1 +:01b8a0fab71425f7213dac77414da7a346b9bd +:01b8b0b3ef2ce79ae52d106b8999f755a06f69 +:01b8c094156f11af290663829886c3c18dbb68 +:01b8d05fb22b564c8937a6ced00e201d2d690c +:01b8e0fd78d3805b47b9379d4b1922de5af925 +:01b8f0437ce9958563176a6be5d5ab1349bec3 +:01b900724039535f93b0944020967651f2eda8 +:01b9107a3bb07e1b64bbc2d00589fd2a6ec9d3 +:01b920ae7eb06d01d9ee8201e8a62115422444 +:01b930325691d277efec60771fceeb82826d8c +:01b940b721d1b1abc45d6dcaed7c51bc28e2ef +:01b950274da6660dd72c8eb8ec15735d911fd1 +:01b960eb600cc0f8617df04e1a93f5595d5d4c +:01b970dcc8ce0396abfe6e6f59ffac68956d0f +:01b98020966b8f4c3c01825a4132bf969e3ed3 +:01b9909faefe31b59b29f616078706e929cb91 +:01b9a05543fc784f7273ee2abe013cc7f47023 +:01b9b0c9ea8c2b4e9e2c72255fe8e4a90f75f6 +:01b9c0f4d36c3b1a784fba593cab21412dc879 +:01b9d0d36e933f606e04ac8a5a3280af4391a5 +:01b9e07b6f596237c1afab5e1784a19b057f2b +:01b9f034aa8b7ebd7440f052d7da6d5041f126 +:01ba00487f8a38dfec38dd935c59c5dc0f4e42 +:01ba108c99447b5438476f791a2f23070a8049 +:01ba20cfbb83901edcd9479794b4a47a815aae +:01ba30521f05e131b2a050d4dfeaedd8c49a27 +:01ba40790d3140365770932f2f15a49d01c55b +:01ba5016ee1e80c605eee4489572301ea5e248 +:01ba602a2283b0852cd607d75b253d3aaeecc0 +:01ba7035349a47673480780ff43a08aef611ac +:01ba80bc1e47714752e9298e226359be728b56 +:01ba90f611f62c0d24bf91f862ef8ee17641dd +:01baa0aca539a7c6b6b9e7a737caf0132324bb +:01bab0951cd46d371926f2a24c4beedb3809d3 +:01bac034cc36fef37ff6cda5f20f3be890a592 +:01bad0eb034afe398acbbcb492ce5e2b57cb52 +:01bae05ed380b80ec4bf8adad865492df697a3 +:01baf058208f7b9fdcfda6ccb0e76b5ea0c31e +:01bb0082f4f161bc96e6f47c5fe609c92f9744 +:01bb103ea221576356ccb66735963de853414d +:01bb20b1175d0fe0c3efba27cb09be3d66064c +:01bb306094920044b7ef417da0df5c475b1c92 +:01bb407fe2bccf9e15fdfa7fafc78b8acbfd4d +:01bb504701e9ad240cc0cf0ef51d65ea5d8ea0 +:01bb60a39f8737a871db91e8bed436eaa43001 +:01bb706d2d76ecc6be494f93b771e502d3575a +:01bb8043e34205b7964197975b19f3b5888599 +:01bb90532b845c9fa45395c271fefa4c43db59 +:01bba05d309bf8fa275c7c16baaf5164698b72 +:01bbb09fb67c29dbe2de35105a8ee28180c15f +:01bbc0f4f46763c674e0d147b07dd5c7a6f39c +:01bbd039cbb14313384cdd4b8f4d79f4094ff7 +:01bbe09cef36660658ebd54691a2449372995b +:01bbf095cfa35afd193843486798ae331f89d7 +:01bc009aaa244a9af18dc7b994bce13c3006aa +:01bc109d4721cfb9cb4cce7b4fef435fa8cf0c +:01bc206c6ce8414e40c2f6cf93a68134c408b0 +:01bc3039ad82ca03ebfbc1adb0f4cf404d1dee +:01bc40cec02bafa3f4a7b53766d5fb8a97e0f4 +:01bc5035de9e7e3296eb4030fdabff92928a8c +:01bc608f14e767a6e28ed2b03c3420d9f50b5b +:01bc707928ff41eb3992d239e52614e61f180f +:01bc800f34869b30183794aeeb16bbbd03baad +:01bc902b3691590632a2caa7ada1c90880bca5 +:01bca08b7ee71aff29cfbe05c5ec94fccc9849 +:01bcb07181ac18296b7eb2d7357e5fd1a277f5 +:01bcc0f0910461c4b690ec09a4d0846f3b5e5a +:01bcd014d9bab3e74d184ca2b56ec255ad23f2 +:01bce07be617ad54507732afc6cbdee4a79a92 +:01bcf0c161a895c2b06da0efa34f237957faf7 +:01bd00358239d330f651e8808570253c731120 +:01bd10f60678957bf693776e094863787ab605 +:01bd205f876714847beb96d7cce30d04305ca1 +:01bd301bcf7856ea972d12d9f675326ac46992 +:01bd403e5d12a0351fef9edcc05f0947f3fbcd +:01bd506ac99f5442254f200d9a6711b663e3af +:01bd605a90ad001e0e965c90f4183548dc4ac5 +:01bd70cb1ab1691afdf8e082a1409d48261ab2 +:01bd805c9d840baf59f552b4bdb52a09efdadc +:01bd9026a7efb7ed6e84cc36656548412d63d7 +:01bda0d3c37af05705de49b1093b40bde3c975 +:01bdb0eaf562d8b661c2efd529d2b607f9e73a +:01bdc08866210dc5366b26fb2a6da77142e172 +:01bdd004466d908a92396c53671c5c3ebc7e81 +:01bde0212258da98882b86def2608f4076619d +:01bdf0300b59a2038c771c5e5e96e2f494c144 +:01be00ce6de7d4793267b7a367f9f443c2ae68 +:01be10b35db3218f2a863e0ed7d52923edc7fb +:01be20ac24da036ce049538c3846972b335be4 +:01be3088898f481db40ccbb543cbb4208e3f57 +:01be4066a223952a5d4578fdb5f4d3fd320418 +:01be504a218d6291067cf20ff56aa75d039483 +:01be60d532d8ebd12d3734c0c5b97f8b17828d +:01be704dbeabd975a92200893b19439f7bfb09 +:01be804e9e290c0ecf00a6949f94a03fcf09a1 +:01be90a46eeb4cadde4752640bc9781f5c9c59 +:01bea0affbb5e2774272fc64be976459cf124b +:01beb03544a741e7d8ce04ee4d4d21cf962587 +:01bec049ed3b174f5501a9ebb210c5c95384c7 +:01bed0228156c45f75be02f2fad2fb21701917 +:01bee0e43554cef6fddcbf057207c5e6d4a4b6 +:01bef0e99d2435eebd0d7ce94d76a6072a39cf +:01bf00f4585961d24716aaad2bae33c4ca96c8 +:01bf1014687a44956f2fb33ec60e810f17bfaa +:01bf2090f24eb8feca1605d9074412a21d966e +:01bf30eb2e6472e33118e83582da76e2144046 +:01bf404a083b25c72119de83e39423aceae6fc +:01bf50eca59de400fdcc44c3c55e956972f907 +:01bf6093e0bd732d849d43677b6955afc64093 +:01bf70ed75cb8d9b9acb44bfacbabc98b970a9 +:01bf80df277b6615e087f8f91a7683316c3ee9 +:01bf9083bce6442f28a62c50ef3a151c538821 +:01bfa08ff929a98c0ea0b4f817e81ba76cba4a +:01bfb0760b8a6d1c8e58029fe8b64c264ecdec +:01bfc0dcaa54975aed804e933e2bdb0c9a606c +:01bfd0dcf21a2d0f208493b8525ff21e1cd14f +:01bfe0a234cbfd151ef9bca383a79bfc63cece +:01bff015ab72fe190aeac32e98cf7d52db058d +:01c000f571a42066b75983fa2c96f0dcd4008f +:01c010052bd7555ea8bb68eec4d99004b097e0 +:01c0206c66a4c2fb7edcbdac05e4b5c8236481 +:01c0303dcd5f6f54d06f740dbba0ff103202ac +:01c040bb5519dc5b490ec4715bddeabe69182f +:01c05052cbefee81a36fc34f74ce9bdf2a539a +:01c0607866a5cda84570ab4da222cdb9120630 +:01c070687a20bc5d5b5ceaa67a23045821334f +:01c080b545cfaed339825dcf5bba0543febd0f +:01c0908e6da7c6e543aa75317a88deba0ebad6 +:01c0a079498a7dfdfdf83178324a9734694fe7 +:01c0b0a464a91a20ce3eb7d9c4898703790fd6 +:01c0c0a87b93f21d6ab868eb3485aa5f2563d6 +:01c0d0b8f1439105d68d03860af8698504888a +:01c0e0278b952f9be60c0cc326d968ed36e156 +:01c0f0b40aae1a5c0792d689e4e8e586f89422 +:01c100732fb6ff9df86198778ba5ac2c3cb8c1 +:01c110bc0ad3762f374f62c4886d6f36fd53af +:01c12008a83253ad170b1811a3c5bb9b54cb82 +:01c13031a311438359f07fa26d4471810f0363 +:01c1400eacd76fb2545221a09f2959d60e9190 +:01c150d25896194f7a94b635919fba5b028f06 +:01c16081068fb2bda6a607382419e109fe7094 +:01c170ed356a8083713fd24332a3daf0ce52b9 +:01c180e833b2ea1aaa069de333adc41f6f595c +:01c190ce50d1b8cc1555fad4e7442e8ae36907 +:01c1a04b2dc49c39e363cc346b3c6cb99fd8f3 +:01c1b034b6adb42b9aaf2fd6aac22b1419b6db +:01c1c075a301eabbedec561b8b7c704b63b9dd +:01c1d0c355741e14d8599554d85834261906ba +:01c1e0d41e967dacfa831c1203ee13765da585 +:01c1f0f4fa61217962827108c05e4e73394419 +:01c200f8a342cd35dcc0271959cb437b7b5c23 +:01c2108486aaaf0bfbe0d1dbb9025979f18a07 +:01c220bf53f6f902bd6149f4277a91ef81b5af +:01c230c91658fabed7c3d316644a5a10608728 +:01c2409fa664a1907ec546658abb11ea0277bc +:01c2506d4231c71f7cf9680c65c88653629dd0 +:01c260c4c24e5c851b38a0c0614067dea8f0cd +:01c270b357904bdca62611762fdb42ba62931a +:01c280312eeac2c82706c6e038532e31bdfb21 +:01c2907194c94e5db98ec525be777131af3dba +:01c2a04ae38228d0becc4916479a6f4d215abd +:01c2b08dc14a46c070469dbfb5d91a8760d38e +:01c2c0f1be3e34603b61bab28f7f8a1c7aba23 +:01c2d04ad87863e4a71972f733df1c6e224bf5 +:01c2e0ab98eff2b2fe14e8d7c3af7946396b60 +:01c2f0d00dc9272d4830f35223b78de5ca5416 +:01c3007be8cc16922495048af249da6eb5f368 +:01c310a65f61ba772dfe9995dff9a1843e4bcc +:01c3205b8a1b5daa74c278dbc893a8b3e497c1 +:01c330458a5856ee937d185b36f20e06bdb138 +:01c340a968570d14fb33c71e40f4390c8e640c +:01c3503587616f965faf41409968fb20549223 +:01c360199eb570acbf9fa2191b0b8a9a5f8788 +:01c37071e2c7ba23e80cfe2d89d4472bbbd532 +:01c3809efbfcfb0ec9098bcb7a1586a8a9a66c +:01c3901613770b2386db4a47e562fabb76f241 +:01c3a04dcf42193e213f2215bec6aea85ed85b +:01c3b01533424bee0491b87e075e4599d2415e +:01c3c0b2394f2499773ed961691257ca027d72 +:01c3d0f5f1df39d1251ed6c8c5b8adf0cab393 +:01c3e010a5fb17f86f90690d6eb8bb39e75a64 +:01c3f063cc00eea73d7306aa9e953b85a79660 +:01c4001efe4dce50dfbe6af504277b6140406c +:01c410801858704cbf4625855bb7c2c661d027 +:01c42081f19f4fe8c8a1f1a4041d7fd38e2304 +:01c430370f508c3da27f4a59889e08175b436e +:01c440c81c461031c51345d5a5e355c22f4c92 +:01c450eb2f3cf6a49d537fdd7ed18aed6a8039 +:01c460534e23080360ebf5f9bc31a4d81402a5 +:01c470e1b9ffdc970ff33241280cdf0ec3a4bf +:01c4803784999bcd926fc1571afdd8bc4967c0 +:01c490b6f90cd9cc4d2821f4f447f50cd602f0 +:01c4a01ab9d5e824c3f8cbe7b4dc9bc50caf5b +:01c4b0bd3cf03710a35622c23089e7d8446064 +:01c4c096479d5b4bd898f34b5ea256ccb418af +:01c4d00ee563bf19d6cca2c93cfd099b7ab32d +:01c4e053cc5c046b1924dad070e233dad86dc7 +:01c4f0ab360de79107e805fd9feb2fee279667 +:01c500d39a52392f98edd91dde279e0ed7d340 +:01c510dfd69ec61b8fc33b09d4b1e3d3fb530a +:01c520a3bda436d901fb8a06813583ca474e99 +:01c53038ec064905d2758ad21b29d27487ed10 +:01c540252115ee16992963a8a7cdeb1b1562f4 +:01c550da4535a9d5b6ddcab07c72b641e73995 +:01c560327c62ffc714bebab9b717ed6c7d50f8 +:01c570613e81cd171280ca5b61218f8bfc1ed1 +:01c5800249c0472d87d7b2e672908382c39bf4 +:01c590547c4b5de4240c143c60bb7bd44022ef +:01c5a08f0ff51568e693721b8a7ac978b5d6ff +:01c5b0a4b908694e6566ae6cd6c5e3d1f87c18 +:01c5c00b0ff481a3948b42574b6f1e20f6a073 +:01c5d095ae60ceff952813436b3a17bc70e664 +:01c5e0dbeee32e2201848e5c514fdf3f423c16 +:01c5f0c33c7a546b954588136b1c9755899ed6 +:01c60016342678760953a5e13c7948f6139d21 +:01c61094de8c18beac316d40c4efb9e3530088 +:01c6207f6a92dc6f5169c85a3654751982378e +:01c6309735d64425a8877b6d59e37a78f68e0e +:01c6401aabb2980089d40df21147e0751bf676 +:01c65002bce797a2711cd80a019fd885016c96 +:01c660431a94e7a0703c8461f1968f534ca048 +:01c67062ff65ad15d3f458f502a62044d6c63e +:01c680f264069be91000b6e6de7ef777eddd19 +:01c6905e35254dc20112160eea89c5067b8e06 +:01c6a05b2e550c2ddd496fb27afd30b73b288a +:01c6b02d918cdfc509c52f3a25625cff509fc4 +:01c6c048160387b46b5c454230dc21f97462e0 +:01c6d002fbd7646abf4231a4620ba75a4b3c2d +:01c6e0029466112615c22ab5a7028e2c8e44e6 +:01c6f016c4d2befba3f6c0aa698c6e7774f228 +:01c700f0e6a43315ae4bdf0e50859c430506f1 +:01c710c7d75b4542e164b917359cfa32766993 +:01c720e345d877cfdc7f58e2317e411813ea86 +:01c7304e5a1a3d77fe44e7a15f8c4fa4423631 +:01c7405d1a6d982d8305b40b7b1cd09f44bba3 +:01c7501a139eea9c42a0049b4869b89e3dae20 +:01c7600f43c0411901f9c39ec6fc99f030d9cf +:01c7702947cd517a27f2082b0b6c12737d7903 +:01c780bea5af9b8b710bcafa523fdfdd5700a5 +:01c790270b1a1c126a4fd78471ceaf7686164d +:01c7a0f7475953c3f412de81b8bedbf8f0c1c4 +:01c7b02f4266de0916b3d341f2cdca171e694d +:01c7c06146b110622d89e46920a06b07268178 +:01c7d080df7380fb7e7710b0ca753e53c9d250 +:01c7e072f9fb70f88d200e04cbd68af5aa4f09 +:01c7f01e8623abc0c3b94ce820fa32a5c2e6c5 +:01c80094f947665eaac0b33ee5d3c45a5c3d60 +:01c81077dd8af37f1fe8f0c24fba5538ec14c1 +:01c820339dbdd16cb550ec94ec5f2ece7f8928 +:01c83097b7531bfa1968faabb9c925d27916b2 +:01c8400c7e279b3bec3a4f5f3242d3efd5ab89 +:01c850d74d708816d348ea4d51061af29d1096 +:01c860ac1bfeaa7eb81a4b39e592dd3265836f +:01c8703c756cd958b1a07ac6ca8f9a8a12bab7 +:01c8803f692e6b9f68c0b561062e85a1401366 +:01c89077e22ab0bc8c4fe8e307fa28e7d0a70b +:01c8a0c2401154fb5688b39fb5651b3444c637 +:01c8b0609379fcebe31affa05a78d60639638c +:01c8c09c9c20e2cc2f05bcf1e25685154f4bc6 +:01c8d0bc4e6cf790ca73a634c55e63e22869cf +:01c8e0fc1bafff771ff232a8ea7d2a2d24c03c +:01c8f056cedc20699993c2ca3c52d36d360cd3 +:01c9007892923b3bef3bbf4c1c6748ad7bf23a +:01c910bc01f0641382d391ef6ae8bede582410 +:01c920866e276e3f014667822ad948af04ac92 +:01c930c713ad7767ab4dea59ce3f99b9477cb8 +:01c940b4ca702758241d8191ea0de692c7baf2 +:01c950e6f6448eab240c93117f0a3ac25d6afe +:01c9602919f044864eda27fc2867b4b4141127 +:01c970c35a6bbd8238af0919a3884d1390207e +:01c980304889a8150f28dbe6fd98c8cd82e51d +:01c990aaa9ee6d70ac3c3cd169801e676bebcd +:01c9a0177f6efa340278c77db6820805ab904a +:01c9b042111f47367eab6e0439f82482c87d68 +:01c9c0133e05cfe0694f5561dd16f5dafdb0ed +:01c9d0049db4d2032f779352062f427ac4b2e9 +:01c9e0e60e8f027804c1b8c72cfd02273309e1 +:01c9f06b3cf50cc94d2bd4ff79936fa5d8496f +:01ca00a73104a57b5144a3b200da4db11fd244 +:01ca102fdd27cd0d61b2090cbb65cabba885fd +:01ca20cd9843ff087819ffdc3091ca38fce759 +:01ca309ad1cfc2811822b7bd9ed3dd0c24e986 +:01ca409cac473d7a4d1505ad1846fa1e38d4fc +:01ca5094f9cf6aa6703f2b609cee26577592bf +:01ca6042c1e948a9ac07f929a3c58925bc7c47 +:01ca702bfca3da4733837f2375058a076afac0 +:01ca808695effe1e311524069d75e573453860 +:01ca90e6b1d4e27fb11a83898e909596a76bc4 +:01caa09a8a4de0afac1bfb0fb2653d0f8f065f +:01cab0c08cf7a46c5ad1c057dd808b500acd1c +:01cac08564777ded35a58d5d78a1bc760b4127 +:01cad0f5dda0d44e7cd8613ea842ec8b4aad67 +:01cae0051f96c4755efcb290978e24a3339c79 +:01caf00fa4f05d43d5d8fcd467084f1d799d09 +:01cb0043e3070280f5b2d7282d3e4c391d905f +:01cb1016bff4b3bfad99cb26cf0c1936000eff +:01cb20dc04bf99a2c8e83a72e66bf9faad4c0f +:01cb30d86d005ea76ae21ab29adb5f96c83e14 +:01cb40c5bf9a0940eb4a3b4ee52ebcc199a9de +:01cb508d227d005301f3c1ad94ab8107d69864 +:01cb60b123b6e7ed3492ebb47d8d96e77f7e65 +:01cb709789bf43125717a4026c7c408299f76c +:01cb80482e637934b7f11ccd6c100d185035f9 +:01cb9073b96d90b299d7c9d80ac5d413d9e869 +:01cba0757c31904e7712b1ae89d6743fab3586 +:01cbb08332b710f55dca525a73cc4a0981c47f +:01cbc083f5386f72fb97c883c4a4dddb632a44 +:01cbd0bce09b5b593305a3e7116ef624c4eadb +:01cbe0984764815ca243a8a6b2694c560634e3 +:01cbf04393fd34154cc06eec51dde926f57bbd +:01cc000e92e719104a198988203a62fd5985f2 +:01cc10b7ec83e05a03ebd6a9f5518b12aa835b +:01cc20509c6cb4c3a0ede1f9430c957ce89191 +:01cc30798c237843aeaf59ba6336983a9ff620 +:01cc40d0fd5c6d9053bc8cb90dd9c00ff3bb7b +:01cc50aa6d04854681ebd565fe7ac44ed2d745 +:01cc60ee74f243b4b818ed6f33c6cb3b850a4d +:01cc70ef7b9ea6793b8f32c98a356707b55961 +:01cc80ed051afba1a910b218be6880fc36e411 +:01cc900141f89427ab60892a2784764a833215 +:01cca0b6fdffc70ec050d1806ae86e7848230a +:01ccb011c4954160ab7456a4b307a62fa3e945 +:01ccc0bbfef7603e6194be6422ba72ac446aa7 +:01ccd0ae4e97cb82e2b0254811c1ac54db2d1d +:01cce0340ee5a45f54473814b804e34e94ee92 +:01ccf0e7b30c700d11ecf60bfc00755e5d4936 +:01cd003f9aa4c20a5ac555427eedfe4ba821ec +:01cd100f56f5b189970bf246d2c468aac8bd52 +:01cd2011824e6af4eee39f65b3f2c2d15c6c4f +:01cd3049470dea43802286bea937a68b4aca54 +:01cd4091b3ab70b932535fe6f024a8b0ce3486 +:01cd50e8e0f96fafe360292feedfdbc94c1fb4 +:01cd607e4c3e55546987986287138a5e5111b7 +:01cd706f7c19ec83a171b22140877c27f042db +:01cd80230b8f6d2f5ca55b531162a6244af7d8 +:01cd90f4bdcf3e1a7ff7f05de21bb9b7a6c053 +:01cda0ebf77679a0edfcf9edc9dd4c2348f971 +:01cdb03ff4387801b225c884d0eff1d2ba9848 +:01cdc0d4c077f9d89f505cae3c86551b3712ad +:01cdd03555b4a2d6f842c7f1a2b720cdb48ad7 +:01cde09c951a8cd9b3610fd64e0b8198343304 +:01cdf0116129e1f5acebe65480737d23f754b3 +:01ce000ff296b37ec14fe420421af1dcd26c09 +:01ce107213bfc00f65dbf4338e980364da8377 +:01ce20c1ecb5f0520ff9e4af5c71e22f83f955 +:01ce30531befc0a2dc9d85a60dd807a9fae3ef +:01ce404e6cf086366914e7edf2a0d3c279abcc +:01ce505eb6a2456ce6d949ad8670bac17f21f5 +:01ce609dfaeb0b7f2b99b6ea69bfffd2b1bdaf +:01ce7012ff3550a386bd79b063d005526d561f +:01ce805a367d9f4464daafa2fde22590d14ccc +:01ce90c8fcc406ae35680ce62dfca2c77c02f2 +:01cea0b713182f9f52d45790f38b4439f7a8d9 +:01ceb0c19bdde303a1fd8a7aa4076dfbf3cb9f +:01cec064b1c9557e96241eeae29c395743ff6f +:01ced0d645240bbd532b4ca0513f716b53514f +:01cee07398aaf0ce9de741a5222305c60f3ee1 +:01cef0eddc2bdf00aafba7aeb845efb810f28f +:01cf00f568c9d8a44f704811118c603dba8cf1 +:01cf106e90af354fa5ed564ffca2c55ebe95d0 +:01cf2018db331306a86938efb33a36b9d075dc +:01cf30996f2c153e56660a818d62ecad9f54aa +:01cf40c24dfd9861b22a62c9af5357e918b0cd +:01cf5074eab9a7ffed7fede741ff56110371f8 +:01cf60f919b1a96bb1292e5cecf7b82311089b +:01cf70f864743ff3af4ffbff1d390d1a2571d9 +:01cf80b73e8ca8f99f1bb5a6621948ed6b0d84 +:01cf90f993d5c11bcdf8c9c6b283353477cecf +:01cfa04618f21562dc2a2612cc7fb782de64b4 +:01cfb071d88672b5a5775d09cefea4dd45beef +:01cfc022484c8a602073945ffb5fa24536043a +:01cfd0d90c71f566b957f19998d87a09e719cd +:01cfe03537e4ea2a5dd274c19d823809841245 +:01cff0f8fd2599cd1179fbcdedf13f00789eab +:01d000018f92671ee6fe43bd1fd34629ee1f21 +:01d010e3608fe4b22be12a019c083cb270a112 +:01d020f029a4803ce487758ccd2aad5ea247b3 +:01d030b68b270cdb126ca394a52078f7ec2c41 +:01d04095db99f60c859b945b168e7f2c5ab4ad +:01d05004e61192b2b342de0cc02a5733dfe1d2 +:01d060f76381c85e8d38e9fb0665ab48293004 +:01d07019111d66128afa027741cbda3d0516e7 +:01d0800a648f8b64a633a9bb799bede1d5cc53 +:01d090725a37cfe74aefa0f4dceb2731b91340 +:01d0a0a9433f982a96a449113eaca8b2e44553 +:01d0b0fea67145277fb9826d6e2e8b299185c5 +:01d0c0ad73ca2897c3d47a3c026fc81454bda1 +:01d0d01f45af52a604f4463ac625a3c4bd9415 +:01d0e0bd8cbaeb5cef84cf17958615ae774ec8 +:01d0f0ee63c7b49af12e5735f6cfb7c52b1965 +:01d100e3641af7611b250f17192c2829f57ce8 +:01d1104a5a72c8e3a3ec446b817c514cbd10de +:01d1206ceb0fbd25996d01718e513c156e0ed5 +:01d1301b323b5742267ef425a3287d958186bf +:01d14069fc4c4fa175d2a6fabfc42219373de2 +:01d1500419ca1b2e9af67bde404dbfd1ebfede +:01d160d9dcef23dba3281d0508e703e0a9fc55 +:01d1702974208f5c3a3fed2fcffba48fb550d6 +:01d180206a6ed8c1c80fba1f0d7cf6bfd7aa40 +:01d1903b1e44a3f1475fde591bc3397f0bdd44 +:01d1a0fba4dc61f088206ceb987f0e8226bdec +:01d1b0f59ee0a4f0db386c0d3107efdd170364 +:01d1c032ef3a6a1d6d6b0acf084d3c3bdbfcf4 +:01d1d0b7554073faa0b9cc2364d30e6ccd8214 +:01d1e044a2832ad958de5672d40ce70ddb6ce8 +:01d1f0b275d0a5b5a4492f7137eecf370b2e9a +:01d2008c0b6472db379398c8add635b1b6622b +:01d210a70bca5b56a348c6e7192509d5149f76 +:01d220c55a1fcf4f8f92e66c95f71f405bfad1 +:01d230e49b198e184f74555d54272892f0e86e +:01d240a416630a3fd973fd87f81cb9d647a63e +:01d25098f5c5bd936b26624a60845d3782b86e +:01d260adda4d8def1a4af78f1683c58cab0728 +:01d270202d07061e6abca339127afbc5ea6cf6 +:01d280329073d6419bcb7ea246ef07b7f11d0c +:01d29022f4c556798568be50104bfc15ab4fb4 +:01d2a047558ca818dfdbd5caf6fca9ebe8b1cd +:01d2b09987bb7ca12be5b41399acf6779f0983 +:01d2c0a460122e30e896151f52448966f62d28 +:01d2d0acccfb4c783868edbba65d5db40fa1c8 +:01d2e0f70aee88aa787e496c25f39cd5e37d8b +:01d2f0df50125159182600d027fd72cede2269 +:01d300ed560954b03006f39b30cc71620e2be0 +:01d3101c9e857baf8eb2be02ee4739b99d87aa +:01d3207208fea87041fd585a07ec01b62c9730 +:01d330203aac5e4c3afe36cd41083d2e5d27ac +:01d34076d87bf022b1827c1d0e918f7184f37b +:01d3502b4915470fd0c346f08960cade2d61e6 +:01d3607feaa951405ac4345b7a1680d04274a7 +:01d370135331f22d61943cc075c27f15459547 +:01d38063a2b2434312768d37a15c09066f5638 +:01d3907fbae6517efd7a6dd48c0bd4495efbb5 +:01d3a0c1124bd3765c02037a2beb357d25ac23 +:01d3b0d2bf6bf1d94ed9894db33a4aef0a6da6 +:01d3c06ffc38afb73db40a54ce4db0dffdbccb +:01d3d0ae751ac5518fb1fcc2c2ea9719e9075e +:01d3e09c4c9e27ecc29e1cccfb61f80b72e43a +:01d3f02d1a2e68f15a4c10d9faa53ce7b092ae +:01d4005abfb7d54dacbeabf0e2a19cf89cc921 +:01d4102034420d3db2496d20f6a48ef791b744 +:01d420a9e05e630940484162b668cd21920aa5 +:01d4303e651df3455deb12b2bfd5d63917495a +:01d440a42e48acc0dcd9787024e9aafe871c28 +:01d4503ba38623aa26042c514cd7e029661890 +:01d4600eb184f249a108e859d8dbdeb27182b0 +:01d4708e1e7b16f49e497925a366fc5c5ebd99 +:01d4803f675a6d0c00354ef761278e7e5e448e +:01d490bc04b4003c4667c46f99c0ba3f33e168 +:01d4a03aa5f8b3f9521099d923e558cb9c7bde +:01d4b08cdb5fe8e8659b04e7fad8a29cb84326 +:01d4c046651b35ece2acc3b6b4baf4b38af747 +:01d4d0ed4ac6a2c6e8e02b40b43689437faf19 +:01d4e0eba607c69a809fcc8f69e492dda62902 +:01d4f014f6a8bf75daafcae95788a8a4b6bf68 +:01d50090d7f28cde8f1feaecb232ecdc0ebe3d +:01d510b5675ad7a915934d2bedb589a609d475 +:01d5204d6c5a020dc893d96789112935138947 +:01d530c46a73afa1154f1de4a3f583ccf278df +:01d540049a405039e5cd944faba4ad78903e59 +:01d550e9df3cf15542d13535d64a1c0076a62a +:01d56083982bf56fb85dc9300122b1482ca9a2 +:01d570c033f905805aa6f36bc324b761c6bcda +:01d5801304a01ca2702483c673da3a04fa843f +:01d5903ff0434abc4b70d2dacd4b17cfa452e0 +:01d5a0b8d36894aca5f603a85d8ada5ab25b17 +:01d5b03dfc84524ec3e250e16b5016ee2a7a81 +:01d5c06b5cf6eee69f352dc8d864f585841440 +:01d5d0b658fd0fc5d0e4f1f65f29151f595a0d +:01d5e01e51c1d0bdac06fef2a872ffe1475f79 +:01d5f07d709a219679476d2beb2044f081e447 +:01d600629e52c5acb957c3cd1b7d9d1679ad38 +:01d6100c803474ea723737bfe80b8e8a30d934 +:01d620219df93d33959dfc7bceecdf49e3e014 +:01d63084f5d63241726032f1011473e7de7ce4 +:01d640dd36b655195a0af0f87df64fe62448c9 +:01d650fb2c6866dfa57eeaad1615493f421650 +:01d66029579264c4b7937a65e33f3fa2b3f288 +:01d670f115a8889555556b6c0b2cc84b573981 +:01d680a2cf06a9a4f740bfc807f71ad567d37b +:01d6909936e0e1cf40a1ae9ebe74377b97c12e +:01d6a0241bc2ed4a1bc2a48759109dbab9d003 +:01d6b0383326392ca9ec59669fa88a333b3c91 +:01d6c09c7bfe6f0896eb6a9ca60b0451bb67ca +:01d6d0364956dbbd327f4efb1bcf39fbeed389 +:01d6e08df2881d6609f2aefed804ea6201227d +:01d6f06e80a9096f894a2ff3cf9cc6f200d23d +:01d700809460ce8a9e3f97174684eac32af0b4 +:01d71097ca0ed321309b3d3858dc9ad62292a2 +:01d7204764279ee6ddc5480fd2a85e67c9593c +:01d7303381684a40d35ca7d39ce2e3ff7058f8 +:01d740581747c1752aeed343de874525f004c2 +:01d7506058b385744f94b6df54c18b4f5d72f0 +:01d760aa0a7ac9d31d33b48b2df129fc203082 +:01d77008338310c27de314d5f0884af4b140e5 +:01d780e8e6a8d26362a185f9343ff767174ce0 +:01d7902ef891fd110d30caeb423abfbfe91cdd +:01d7a0272a9224967e5ba0041086cc106e4eab +:01d7b072ff57fd5f78be194a3c71da26d0a881 +:01d7c04e45cd48ef6d3a50299157f6b86b80e1 +:01d7d0c13a3c0cf42993a00bdd882c0e63dccc +:01d7e0d063750d6ddc8161469ab024d5077190 +:01d7f0a759f50a94177451af2b208b06462227 +:01d80022aa5a7434f41f325c04861b4597bbaa +:01d8108e93cb410bead80427ef17c1e08a517c +:01d8201cdd859650106b2f53aff2b2251927d3 +:01d8304beea7f359c1ac7b165e70aa45ad6ee1 +:01d840b6a3d5f4b8485585546aaeb2fcf039bb +:01d850e7f9484ec6fc245e13d65c83065e090a +:01d8605b8509ec90040ed7e714144b17717b9f +:01d870ab3d6cbdb9e9bde5bb18fd5244c6ae11 +:01d880e4898eced57c709e18154f08e0ab70d2 +:01d890986fc20ff10c7feefbb462db96b196a4 +:01d8a07661dcf6549e5715d8475ddf778ed978 +:01d8b0ce23a661ddb6d8a0044ab5bbb84cab11 +:01d8c0be38361dc8fc47c1678a7ecf4d76f58e +:01d8d0f1758c11ecbdc8961acf92bed0f566a7 +:01d8e05745e1fa4307bec5fd4c30965fec6e31 +:01d8f0f4bf20f7e98807dabb64c0cd8a0cf3c4 +:01d90040bffa1f077c01e3f597eaec954a87af +:01d9105d64c1b1d161b3a76410bd755f276473 +:01d9201f22b770366b41f7550fa45c710d4f51 +:01d93034b98e4ab7bccbde76537ff31a1be44c +:01d94095b4507cc2dcc313f7aa38e6a003d98d +:01d950232232b62cc05163256415d9094ac4a1 +:01d9602a09ec113f33535fb475b62cb5298a1f +:01d97086e0a6390484fed42a36f195fc2a0549 +:01d9807ef5f13eaccf24241cb9fd61210dd2fc +:01d99049fd313454c66db38d9a1fed57b97697 +:01d9a07f173589be1ff5616676f0c69e3e547e +:01d9b0d7636290a7f880f69fac22f769a2145f +:01d9c0218db4df21c75b929467fa0e5e6d6dbc +:01d9d0348a575fc63bf3eb1cd1b9299c44a601 +:01d9e09dea932c80d5f3a443dddaaa79929a6e +:01d9f0b09eb8f82678e0bd2f5806699a731156 +:01da004ff5f4c9b1d5065e93b25c128be90faf +:01da104dfa2e05b945099efc251808f0f97574 +:01da20e4dfe655e60743fe84153fe5d1a1ccde +:01da3084e97df85c1585116cf0c813ac8bfdb0 +:01da408e20dbd2e6f4bae6c845b9897604878c +:01da50070305561850f7a1f7693773fa1b4061 +:01da60491c2195b527e81f048990ed7d16ee9d +:01da70408960c4cde901eaa643267804ed3761 +:01da8047c82ff9513a5514efce6705e3f80957 +:01da907b45707becb3b2c41b7bf9b2291c8dd2 +:01daa03dd4624b9162ce9ddfad3e8736133240 +:01dab0b27ca2ba0082a54df7646efd35d502ba +:01dac0d6feae6556feed43fc18baa61e988dc1 +:01dad0e5f3eb534d37c4aa945d453d3646ada3 +:01dae01e2920d4d8e01d288401a2f9dbe2d0c0 +:01daf092b9d6f8939f6cb04e9914cd29da7374 +:01db00fe1aa5d122ec3faf4caae4b7510812d5 +:01db1006a80cb80d2529f7fdeb541015710e02 +:01db204027951ef5b4a21cf153df9f71740109 +:01db3079bffaf48f648faf2d0f8e6a47e1e58e +:01db401a610ddd769640e51d28bc3c748d50dd +:01db50af144263eb267f0457bdeb5bad1326e6 +:01db6086d6065403d9c1332f6acd3cc59e16ab +:01db70e161139e0b34b6b41f0a59f0211d52b9 +:01db805b9ea1e3457c159bb6d8e965bf61d3cd +:01db9072f79b69332fbcc095b2341f4a8dfecf +:01dba0c0fa3149c0a3243a0d3e78c50ba6b3c7 +:01dbb0a06b73ffa9bce298150748b77e598f58 +:01dbc0d5ac7997b1e8f9d8b45f0fa92e232ecd +:01dbd0f111c2fe153d1f338dc0332a9ee3f419 +:01dbe02f188aced43518833b9b9532ada9cc6c +:01dbf04809e2c73546f418d03c483663df8403 +:01dc00d1c72724b4d01832b37de40bf42b289f +:01dc107372e86c5b597bd36e2ad6403de859b1 +:01dc2014b3fc759df34dc515530605d15a0335 +:01dc3082453dd21d17ff5f7e710d888e1b99c6 +:01dc40405558f81de41933ebb7b285054e031d +:01dc5046bb4ca88ee9c541538fe61649b920bc +:01dc605c7fffbe1c84a9754e4b5516e6e80018 +:01dc70d758016acc3f0fa8b9fa397d187d4a65 +:01dc800d6f099dd30d8ae36d8fb678f09cbd6a +:01dc90ede7a2a93e6b326de07d6bffdc6902bd +:01dca028cf6e72f82977e11238e3adf6aac33c +:01dcb034af4a85cd381f5da7802d5290f02d6e +:01dcc0ee1103d206ed91fdafd4f1a2548ea4fe +:01dcd018868179b0c89d161d92e90356a41ead +:01dce06950193b24261e6310cdeced932f1ef9 +:01dcf0570b4328a6530b8b9857cb70f166c60e +:01dd00c843d9407cdfd4432755c5f72cddb19e +:01dd1002b250211f555f5b93eae179b96dc6e5 +:01dd20d0573ec97c144d44933bcafb9e69bdda +:01dd3066ad327d52cfe99e3338e1537a444df0 +:01dd40bc13f53019573abbb35f0ba6ad4d3c35 +:01dd5036d0cdb4312b353961bbf7b91ecf9392 +:01dd605d6bcfec81f1fff89c65482c85d3c50b +:01dd704e6c3c238c864ca12c6239f7e9098d99 +:01dd80b617fe154e0b2814fc92c6422cbc02e4 +:01dd906db7da8405df013ee737fc7557497967 +:01dda0a67ea1548d75198b7d5353c4c8142028 +:01ddb0fd82688dced293d2f0d5f69a11490ac3 +:01ddc033f55fdfdb4553b8e417d5bfcf4e01fc +:01ddd02ea539ad3893570db3925797645c7fc0 +:01dde051495724fc1284f1cc35f77eb3251aa6 +:01ddf096a12e1df401480cc0a4fe1c6571274f +:01de00c64507d94c186be63c5de0b06c253275 +:01de10f5f8bf08bf32b37afe2579617fc39cb3 +:01de20c91723e22ad1da081d6267e1fa5c8182 +:01de30567b2214aa043d87ffbac930b97b2e3d +:01de405a6b7b58bae272e83e79ce4331c91e51 +:01de50df851af85e3651bb3f1c1a2c097c3e3b +:01de608f6fdfd94f3c2ded30a9a047c486b285 +:01de70f95e4f64911902e79221b1008cc21206 +:01de80ca36c0fb112f7d5429f052b2d0fb9119 +:01de90b7162c7625190d91039d917562c0e832 +:01dea0685b294e2211ebb8b531081367be9a6a +:01deb0eb259069fae4ad80a38d239b26510315 +:01dec02789f8d447a350e01863165c18bfd3da +:01ded09db60d54796ae7508ba43d31786a7869 +:01dee01ca62895d52cf975581820011feeca8f +:01def0bb888a5133dd2b136c7a854b5c2dd34f +:01df00863f380abd11370e2d74be994a02c4eb +:01df104c264e0235913bc209b99174839cc897 +:01df20a46bd848a46269917a551245ac0695d3 +:01df3096755e155f202de5d2db38fbc3d80451 +:01df40e130dcfa7ba56341389ed22c1afeb4cb +:01df50deca626ea1c379a94b4931222863cf25 +:01df601527e2da9155af222dd97eb84e801891 +:01df70b7970255914e89b86be05cfd1a0dde91 +:01df803a533802027df983255d8cea25f27d84 +:01df909ec2240a667ec51f7518083c44d1267a +:01dfa07f22accf878b57c1aa5fd9c8ae7bfac2 +:01dfb0d2985debbd88b3aa0636974c2efe09ec +:01dfc07693888db6840b67dc8f9b8089d2c1eb +:01dfd03bc1da8ca908cbbc30013b30f70014f3 +:01dfe0ab4e73c179019c8dbcbc61ee6577199c +:01dff045663146a81222473703773b3156b306 +:01e000e67c2e4b6f8ac6581a20a7be91e9ad69 +:01e010b7553d17