Barometer mit Matlab/Simulink: Unterschied zwischen den Versionen
Zeile 20.763: | Zeile 20.763: | ||
Die Präsentation der Ergebnisse von diesem Projekt sind in dem Folgenden Video kurz zusammengefasst: | Die Präsentation der Ergebnisse von diesem Projekt sind in dem Folgenden Video kurz zusammengefasst: | ||
https://youtu.be/njidXAXhs6Y | |||
== Zusammenfassung == | == Zusammenfassung == |
Version vom 5. Juli 2018, 23:50 Uhr
Sensor: NXT Barometric Sensor (NBR1036)
Autor: Tobias Wemmer
Betreuer Prof. Schneider
Einleitung
Dieser Wiki-Artikel beschreibt die Semesterarbeit von Tobias Wemmer im Modul SigSys SoSe2018. In diesem Modul sollte jeder Teilnehmer die Funktionsweise eines jeweils anderen Sensors verstehen und diesen via Matlab/Simulik auslesen und kalibrieren. Gegeben waren neben dem eingentlichen Sensor noch die Tools Matlab und Simulink. Die Funktionsweise des Sensors sowie Datenblätter musste, falls vorhanden bei der Recherche gesichtet werden. Letzteres war für diesen Sensor nicht mehr zugänglich. Es gab jedoch ein Beiblatt zum Sensor, welches sich in erster Line mit dem Auslesen des Sensors via NXT Stein beschäftigte. Daher musste experimentell an der Lösung gearbeitet werden.
Aufgabenstellung
- Lesen Sie den Sensor mit MATLAB/Simulink aus (MATLAB/Simulink Toolbox).
- Beschreiben, untersuchen und verstehen Sie Ihre Signalverarbeitungskette.
NXT Baromitric Sensor (NBR1036)
Vorstellung des Sensors
Bei dem Sensor handelt es sich um den „NXT Baromitric Sensor (NBR1036)". Wie der Name schon sagt, ist dieser Sensor ein Barometer, jedoch kann der Sensor neben dem Druck auch die Temperatur messen. Dadurch eignet sich der Sensor gut als Komponente einer Wetterstation.[1]
Wie Abbildung 1 zu entnehmen ist, lässt sich der Sensor auf den ersten Blick nicht von anderen NXT Sensoren unterscheiden, da er das Standard NXT-Gehäuse besitzt. Zur Unterscheidung der einzelnen Sensoren ist eine Beschriftung auf der Unterseite des Gehäuses vorhanden.
Messgenauigkeit
Der Sensor misst Analoge Werte (Druck und Temperatur). Die Messwerte werden mittels Analog-Digital-Umwandler (ADU) digitalisiert und somit für die Digitale Auswertung via PC verarbeitbar gemacht. Welcher konkrete ADU verwendet wird konnte nicht herausgefunden werden. Diese Digitalisierung führt zu Messbereichen bzw. Schritten statt unendlichen einzelnen Werten. Der Grund dafür ist ein endlicher Speicher, welcher nicht in der Lage ist unendliche Werte speichern. Daraus resultiert eine Messgenauigkeit bzw. Ungenauigkeit für den Sensor. Diese ist vom ADU abhängig.
Die Messgenauigkeit des Sensors beläuft sich beim Druck auf ein Tausendstel Zoll auf der Quecksilbersäule. Umgerechnet in Pascal ergibt dies 3,386 Pascal pro Schritt.
Die Temperatur wird in 0,1°C Schritten gemessen.[1]
Einstellungsmöglichkeiten für die Einheiten der Messung
Der Sensor lässt sich dahingehend einstellen, dass die Druck-Signale in inHg (Zoll auf der Quecksilbersäule) oder in hPa ausgegeben werden können. Für die Temperatur lassen sich die Signale in °C oder °F ausgeben. Standardmäßig sind die EInheiten inHg und °F eingestellt.[1]
Kommunikation des Sensors
Der Sensor kommuniziert über eine I²C-Bus.[2]
Der Vorteil des I²C-Bus und von Bussen allgemein, besteht darin, dass nicht mehr unzählige Kabel und Leitungen verlegt werden müssen, sondern stattdessen ein Kabel ausreicht. Über dieses Kabel bzw. diesen Kabelbaum können mehrere Geräte nahezu ‚gleichzeitig‘ kommunizieren. Der I²C-Bus wurde von der Firma Philips entwickelt und zum Standard unter den Bus-Systemen gemacht.
Der I²C-Bus arbeitet mit lediglich zwei Leitungen zur Datenübertragung, neben der Spannungsversorgung (GND und Versorgungsleitung). Diese beiden Leitungen sind die Datenleitung (SDA) und die Clock-Leitung (SCL). Dabei werden sämtliche Daten über die Datenleitung geschickt. Die Clock-Leitung wird zum austakten der Signale bzw. zur Abstimmung der angeschlossenen Geräte untereinander genutzt. Die Taktrate des I²C-Bus liegt zurzeit bei 400kbit/s.
Die Adressierung der angeschlossenen Geräte erfolgt über 10-Bit Adressen, wovon das letzte Bit angibt, ob das gerät liest oder schreibt. Die restlichen Bytes sind danach vom Bus abhängig.[3]
Die Kommunikation bei I²C-Bus als solches findet immer zwischen einem Master und einem Slave statt. Dabei sendet der Master immer eine Start-Condition, wodurch alle angeschlossenen Slaves ihre eigene Adresse, mit der angeforderten Adresse des Masters vergleichen. Der Slave mit der passenden Adresse sendet dann eine Acknowledge-Message an den Master und kann dann mit diesem kommunizieren, bis dieser eine Stop-Condition sendet und so die Kommunikation beendet und den Bus für neue Kommunikationen freigibt.[3]
Anschluss des Sensors
Normalerweise würde der Sensor über einen NXT Stein angesteuert und ausgelesen werden. Das Ganze funktioniert als Plug-and-Play. Zum Einlesen des Sensors in Matlab/Simulink wird eine Toolbox der RWTH Aachen benötigt. Mehr Informationen dazu gibt es unter folgendem Link:
https://de.mathworks.com/hardware-support/lego-mindstorms-matlab.html
Alternative Herangehensweisen
Wenn kein NXT-Stein vorhanden ist oder andere Gründe gegen die Verwendung sprechen, so gibt es mehrere Alternativen den Sensor trotzdem auszulesen. Je nach Durchführung und Möglichkeit kann dazu das NXT-Kabel direkt angeschlossen werden. In machen Fällen lässt es sich jedoch nicht vermeiden, dass Kabel aufzuschneiden und die Litzen einzeln auszulesen. Die Pinbelegung ist in der nachfolgenden Tabelle aufgeführt. In der rechten Abbildung ist ein aufgeschnittenes und umbebautes Kabel für die Verwendung am Arduino/Sigrok nutzbar gemacht worden.
Tabelle 1: Pin-Belegung[4]
# | Farbe | Funktion |
---|---|---|
1 | Weiß | +9V Suplly (Analog) |
2 | Schwarz | GND |
3 | [Rot | GND |
4 | Grün | +4,3V Supply |
5 | Gelb | I²C Clock (SCL) |
6 | Blau | I²C Data (SDA) |
Decoder/Analyser-Ansatz
Es ist möglich den Sensor mittels eines Decoder/Analyser auszulesen. Der Vorteil dabei besteht darin, dass dieser in der Lage ist die Bus-Adresse des Sensors direkt auszulesen. Dies erspart Zeit sofern die Adresse nicht bekannt ist. Weiterhin können die Daten direkt verarbeitet werden.
Ein möglicher Decoder ist der Sigrok. Ein Nachteil bei diesem Ansatz ist die Notwendigkeit des Aufschneidens des Kabels. Ein weiterer Nachteil besteht darin, dass eine Gewisse Vorkenntnis benötigt wird, was Programmierung angeht.[5]
Weitere Informationen zum Sigrok sind unter dem folgenden Link zu erhalten:
https://sigrok.org/wiki/Protocol_decoders
Arduino-Ansätze
Es gibt zwei Ansätze, mit denen der Sensor via Arduino ausgelesen werden kann. Beide Ansätze sind relativ ähnlich, sie unterscheiden sich lediglich in der Art und Weise, wie der Sensor an den Arduino angeschlossen wird.
Beim leichten Ansatz wird der Sensor mit seinem NXT-Kabel über ein Dongle an den Arduino angeschlossen. Dabei müssen lediglich die Spannungsversorgung, GND, Die Clock-Leitung und die Signalleitung richtig angeschlossen werden. Der Vorteil dieses Ansatzes liegt darin, dass der Anschluss leichter ist. Auf der anderen Seite ist die Anschaffung eines solchen Dongles mit Kosten verbunden. Ein solches Dongle ist unter folgendem Link erhältlich:
http://www.mindsensors.com/ev3-and-nxt/58-breadboard-connector-kit-for-nxt-or-ev3
Beim schwierigeren Ansatz wird der Sensor über ein Steckbrett oder eine Platine an den Arduino angeschlossen. Dazu muss allerdings das Kabel des Arduinos aufgeschnitten werden. Anschließend müssen die Litzen einzeln ausgelesen werden.
Der Vorteil bei diesem Ansatz besteht darin, dass kein Dongle gekauft werden muss. Wenn allerdings ein solches Dongle bereits vorhanden ist, macht es wenig Sinn den schwierigeren Ansatz zu verfolgen.
Bei beiden Ansätzen gilt es einige Regeln zu beachten, diese werden im folgenden Kapitel näher erläutert.
Vorgehen beim Arduino-Ansatz
Der Arduino wurde wie in der schematischen Abbildung mit dem Sensor verbunden. Die 2K7 Ohm Pullup-Widerstände waren dabei essenziell, um die Clock und die Datenleitung auf eine positive Gleichspannung zu ziehen. Ohne die Widerstände ist ein Auslesen des Sensors nicht möglich, es sei denn es wird ein Spannungsteiler verwendet, dabei müssen jedoch größere Widerstände verwendet werde. Jeweils ein 100K Ohm Widerstand auf die Masse ist dabei eine mögliche Herangehensweise, mit der es zumindest möglich ist die Adresse des Sensors auszulesen. In wie weit die einen Einfluss auf die Messwerte hat, wurde nicht getestet.
Wichtig: Auch bei der Verwendung des Dongles müssen die Pullups verwendet werde, es sei denn diese sind bereits im Dongle integriert.
Nachdem der Sensor angeschlossen wurde, muss die Bus-Adresse des Sensors ausgelesen werden, um diesen auswerten zu können. Dazu gibt es Arduino Programme, welche die I²C-Adresse herausfinden, alternativ kann auch direkt über Matlab die Adresse ausgelesen werden.
Einen I²C-Scanner gibt es z.B. unter folgendem Link:
https://arduino-projekte.webnode.at/i2c-scanner/
Vorgehen bei der Messung
Da die Messwerte eines Barometers und eines Thermometers eher schwieriger zu ändern sind. Wurden zunächst konstante Werte gemessen und anhand dieser Werte der Mittelwert und die Standardabweichung berechnet.
Für genauere Messungen mit dynamischen Werten wäre ein Klimaschrank nötig gewesen. Für dieses Projekt wurde daher ein improvisierter Klimaschrank gebaut. Dazu wurde ein luftdicht verschließbarer Gefrierbeutel genommen. In diesen wurden zwei Löcher geschnitten, durch die zum einen das Sensor Kabel und zum anderen der Schlauch einer Luftpumpe geführt wurde. Anschließend wurden die Löcher Luftdicht versiegelt. Durch den Zippverschluss wurde anschließend der Sensor an das Sensorkabel angeschlossen. Danach wurde ein Vergleichs-Thermometer (digital) in den Beutel gestellt. Dieses sollte Referenzwerte für die Temperaturmessung liefern. Für die Druck-Referenzwerte wurde das analoge Barometer der Luftpumpe. Beide Referenzmessmittel konnten nicht mit dem PC verbunden werden, daher mussten die Referenzwerte abgelesen werden. Die nachfolgende Tabelle 2 zeigt die verwendeten Materialien. Später im Kapitel „Ausblick“ werden Verbesserungen für diese Konstruktion genannt.
Tabelle 2: Materialliste für den improvisierten Klimaschrank
# | Material |
---|---|
1 | Gefriebeutel mit Zippverschluss |
2 | Luftpumpe mit analog Barometer |
3 | Dichtmaterial (Klebeband) |
4 | Digital Termometer |
Nach der Fertigstellung und Vorbereitung des improvisierten Klimaschranks wurde der Zippbeutel verschlossen und auf Dichtigkeit überprüft. Anschließend konnte die Messung beginnen. Zur Manipulation des Drucks konnte der Druck durch betätigen der Luftpumpe erhöht werden. Die Temperatur konnte durch einen Fön beeinflusst werden. Alternativ kann die Veränderung des Drucks durch Messungen in verschiedenen Höhen (z.B. Stockwerken) erfolgen. Dazu ist es jedoch wichtig die Temperatur und die Tatsächliche Höhe als Referenzwert zu kennen. Eine weiter Alternative besteht darin den Sensor, wie durchgeführt, in einen Luftdichten Beutel zu stecken, von dem das Fassungsvermögen bekannt ist. Anschließend wird der Druck durch Gewichte Realisier, die auf den Beutel gelegt werden.
Zum Auslesen der Sensorwerte wurde ein kurzes Arduino Programm geschrieben. Dieses Programm arbeitet mit der Wire-Bibliothek (Wire.h), welche es dem Arduino erlaub via I²C zu kommunizieren. Aufgrund der Geschwindigkeit des Prozessors des Arduinos, können die Werte nur im 1000stel Sekundenbereich aufgezeichnet werden.[6]
//Bibliothek zum auslesen der I²C Kommunikation #include <Wire.h> //Zuweisung der Sensor Adresse (aus Scanner) #define Sensor 0x01 //Deklaration Speichervariablen byte msb; //erste Byte ist MSB (höherwertig) byte lsb; //zweiter Byte ist LSB (niederwertig) float fl_Messwert; void setup() { Serial.begin(9600); Wire.begin(); } void loop() { //Jetzt werden 2 Bytes vom Sensor angefordert. Zuerst kommt der MSB (hochwertige Byte) und dann der LSB (der niedrigwertige Byte). Wire.requestFrom(Sensor, 2); if(Wire.available() >= 2) { msb = Wire.read(); //erste Byte ist MSB (höherwertig) lsb = Wire.read(); //zweiter Byte ist LSB (niederwertig) // Umwandeln von 16 Bit auf 12 Bit fl_Messwert = ((msb)<<4); //Verschieben von MSB nach links fl_Messwert |= (lsb>>4); //Verschieben von LSB nach rechts Serial.println(fl_Messwert); } delay(5); }
Auslesen via Simulink
Neben dem Auslesen via Matlab, wurde der Sensor auch mittels Simulink ausgelesen. Das Simulink Grundprogramm daür, ist der Abbildung (Simulink Grundprogramm) zu entnehmen. Das Grundprogramm liefert zunächst nur einen Plot und eine Ausgabe von konkreten Messwerten, welche aus dem I²C-Bus ausgelesen werden. Dazu ist es notwendig, die Arduino Toolbox der RWTH Aachen zu installieren.
Das Grundprogramm reicht nur für erste Messungen aus. Zur Kalibrierung des Sensors müssen Filter und weitere Einstellungen an diesem Programm vorgenommen werden. Je nach Art der Messabwichung und Ungenauigkeit sind unterschiedliche Filter zu wählen.
Auswertung Messergebnisse
Die Aufnahme der Messwerte war auf Grund der Test-Apperatur schiewriger als erwartet.
Die Aufnahme der Messwerte war auf Grund der Test-Apparatur schwieriger als erwartet und wurde aufgrund mehrerer Mängel stark behindert. Das Hauptproblem bestand im fehlen eines Klimaschranks. Der improvisierte Klimaschrank stieß schnell an seine Grenz, was sich dadurch merkbar machte, dass der Druck nicht konstant blieb. Auch Nachbesserungen an den Durchführungen für die Luftpumpe sowie den Sensor reichten nicht aus. Es stellte sich heraus, dass der Zippverschluss bei zunehmendem Druck nicht mehr zu 100% dicht war. Der Maximal Druck im improvisierten Klimaschrank belief sich auf 2 Bar, laut Referenz Barometer. Problematisch war dort, dass der Sensor deutlich niedrigere Druck-Werte anzeigte. Auch nach mehreren Versuchen und Umbauten der Apparatur war es nicht möglich bessere Ergebnisse zu erziele. Auffällig war hier, dass das Referenzbarometer stark Schwankte, was vermutlich auf die Dichtigkeit der Konstruktion zurück zu führen ist.
Die Messung der Temperatur lief ähnlich schlecht bzw. langsam. Der Sensor ändert nur äußerst langsam seine gelieferten Werte. Der Versuch durch höhere Temperaturschwankungen schnellere Ergebnisse zu erzielen schlug fehl. Dabei wurde mit einem Föhn auf niedrigster Stufe der improvisierte Kleiderschrank erhitzt. Der Sensor lieferte nur eine minimale Steigerung der Temperatur. Das Referenzthermometer hingegen reagierte deutlich schneller auf die Temperaturänderung, versagte jedoch nach kurzer Zeit und fiel aus. Dies war zum einen an einer fehlerhaften Ausgabe und zum anderen an einer schwarzen Verfärbung des Displays zu erkennen, welche sich allerdings nach dem Abkühlen wieder normalisierte (siehe Abbildung: Schwachstelle Thermometer). Die Messwerte des Referenzthermometers sind nach dem Abkühlen wieder in normal, sodass weitere Messungen erfolgen konnten (wenn auch mit niedrigeren Temperaturen).
Aufgenommene Messwerte
Die Aufgenommenen Messwerte aus der Simulink Simulation gabe keinen brauchbaren Rückschluss auf die gemessenen Werte des Sensors. Der zugehörige Plot ist der nebenstehenden Abbildung aufgeführt (Simulink Plot der vermeidlichen Messwerte) sind in den folgenden Tabellen aufgeführt:
Die Messwerte im Display der Simulation entsprachen den im Plot gezeigten Werten, allerdings konnte dadurch nicht auf eine aktuelle Temperatur bzw. den aktuellen Druck geschlossen werden. Dabei war es egal, ob die Messwerte in °C oder °F bzw. in hPA oder inHg angezeigt wurde. Die Schwankungen des Plots sind deutlich zu groß, als das sie stimmen könnten, daher war es auch nicht sinnig zu versuchen mit Filtern bessere Werte zu erhalten.
Zur genaueren Untersuchung der Ursache der krummen Messwerte wurde das Arduino Programm wieder herangezogen und die Messwerte wurden erneut betrachtet. Das Ergebnis befindet sich in der untenstehenden Liste.
1158
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1903
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1904
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1904
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1905
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1907
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1910
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1914
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1918
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1924
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1930
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1936
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1942
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1948
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1953
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1957
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1961
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1965
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1967
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1969
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1971
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1971
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1971
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1971
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1970
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1969
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1966
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1964
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1961
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1958
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1955
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1952
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1949
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1946
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1945
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1943
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1942
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1940
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1940
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1940
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1940
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1940
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1940
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1941
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1941
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1942
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1942
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1943
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1943
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1944
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1945
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1945
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1943
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1941
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1938
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1934
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1931
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1928
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1926
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1923
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1921
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1919
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1917
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1916
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1915
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1913
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1912
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1911
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1910
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1910
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1909
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1908
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1908
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1907
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1907
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1906
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1906
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1906
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1906
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1905
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1905
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1905
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1905
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1906
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1906
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1906
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1906
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1907
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1907
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1907
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1909
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1912
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1915
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1916
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1914
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1913
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1912
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1911
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1910
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1909
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1908
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1908
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1907
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1907
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1906
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4053
786
786
514
1158
1350
1590
1766
1062
1830
1750
1863
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
72
1906
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Während der Messung über das Arduino-Programm wurden der Druck und die Temperatur im improvisierten Klimaschrank zeitweise erhöht, sodass es dort zu Schwankungen kam. Diese wurde auch aufgenommen. Es stellte sich heraus, dass die Daten nicht willkürlich, sondern Systematisch waren. Die tatsächlichen Messwerte des Drucks und der Temperatur wurden zusammen mit anderen Daten gesendet. Bei betrachten der Messwerte fällt auf, dass kontinuierlich eine „0“ gesendet wird. In regelmäßigen und gleichen Abständen wird dann der folgende Zahlenblock gesendet:
4053 786 786 514 1158 1350 1590 1766 1062 1830 1750 1863
Anschließend werden wieder mehrere „0“ Werte ausgegeben (ebenfalls in gleichen Abständen), bevor dann zwei Werte direkt aufeinander folgen, die zum Teil leicht abweichen. Die ersten beiden Werte sind die folgenden:
72 1903
Der erste dieser Werte stellte sich als Temperatur in °F heraus und der zweite Wert als Druck in inHg bzw. als Tausendstel. Die Raumtemperatur betrug zu dem Zeitpunkt laut Sensor 22,2 °C und der Druck 6,444 kPa, was durchaus realistisch ist. Zum Vergleich: Das Thermometer hat einen Wert von 22,5 °C angezeigt. Das Barometer hingegen stand auf 0 Bar, da lediglich der normale Luftdruck gewirkt hat. Dafür passen die 6,444 kPa.
Durch ein betätigen der Luftpumpe ist der Luftdruck des Sensors angestiegen. Ähnliches gilt für die Temperatur. Allerdings ist hier zu beachten, dass bei der Messung bzw. dem Test der Temperaturänderung mittels Fön das Referenzthermometer abgeraucht ist. Der letzte Referenzwert betrug 49,7 °C. Der maximale Temperaturwert des Sensors 79°F bzw. 26,1°C. Angesichts der Tatsache, dass das Referenztermometer überhitzt und abgeraucht ist, liegt die Vermutung nahe, dass der Sensorwert bzw. dessen Steigerung zu langsam ist. Die Ursache liebt vermutlich in der Isolierung und bei der Wärmeübertragung des Gehäuses. Da der Sensor eigentlich für eine Wetterstation verwendet wird, ist es wahrscheinlich, dass eine Solche schnelle Messwertänderung nicht vorgesehen ist.
Ein weiter Auffälligkeit besteht darin, dass der Sensor nur natürliche Zahlen liefert, obwohl laut Datenblatt eigentlich im Zehntel-Bereich °C bzw. °F gemessen werden sollte. Dies kann allerdings auch an der Verwendung des Arduinos liegen, auch trotz Messwerten im float-Format.
Matlab-Auswertung
Die Messwerte des Arduino-Programms sind in der nachfolgen Tabelle aufgelistet. Bei diesen Werten handelt es sich um jene Werte, bei deren Messung das Referenz-Equipment ausgefallen ist. Zu diesem Zeitpunkt betrug die Delay-Funktion 500ms, anstelle der oben aufgeführten 5ms. Daher sind nur wenige Werte vorhanden. Die Intention dabei war es, zu versuchen, ob der Sensor bessere Werte liefert, wenn die Spanne zwischen den Messungen kleiner ist. Neben dem Abrauchen des Referenzthermometers, stellte sich heraus, dass diese Intention falsch war. Allerdings war in diesem Aufbau ein konstanter Druck gegeben und dennoch gab es dort vergleichsweise große Schwankungen. Die Dauer der Messung betrug ca. 30 Sekunden. Da die Summe der Delays gerade einmal 8 Sekunden beträgt, deutet dies darauf hin, dass der Sensor einige Zeit benötigt um die Signale zu senden.
Tabelle 3: Messwerte zum Ausfall des Referenzthermometers
# | Druck in ínHg | Temperatur |
---|---|---|
1 | 1902 | 68 |
2 | 1903 | 75 |
3 | 1903 | 75 |
4 | 1904 | 75 |
5 | 1904 | 75 |
6 | 1905 | 75 |
7 | 1905 | 75 |
8 | 1904 | 75 |
9 | 1904 | 76 |
10 | 1904 | 76 |
11 | 1904 | 76 |
12 | 1905 | 76 |
13 | 1905 | 77 |
14 | 1905 | 77 |
15 | 1905 | 77 |
16 | 1905 | 78 |
Dem Graphen für den Druck ist zu entnehmen, dass dieser steigt, obwohl im Testaufbau der Druck eigentlich konstant war. Es möglich, dass die Erhöhung des Drucks aufgrund der Erwärmung innerhalb des Gehäuses erfolgt ist. Allerdings schwanken die Werte. Zur Auswertung des Messwerte wurden mit Matlab der Mittelwert und die Standardabweichung der Temperaturmesswerte berechnet.
Druck Mittelwert: 1904,3 inHg
Druck Standardabweichung: 1,0782 inHg
Im Graphen für die Temperatur sieht man eine Steigung ebendieser. Es fällt auf, dass die Steigerung nicht konstant ist. Weiterhin ist direkt der erste Wert ein Ausreißer. Vermutlich ist dies ein zufälliger Fehler, da der Sensor allgemein nur in 1°-Schritten Messwerte ausgibt und auch nur äußerst langsam eine Erhöhung der Temperatur ausgibt. Zum Vergleich hat in der selben Zeit das Referenzthermometer eine Erhöhung auf 49,7°C, also 121,46°F angezeigt. Diese Schrittweise und langsame Erhöhung der Temperatur, lässt vermuten, dass im Sensor ein ADU ‘‘‘Nachlauf-Umsetzer‘‘‘ verbaut ist. Warum die Auflösung nicht passt, bleibt unklar. Auch bei diesen Messwerten wurden der Mittelwert und die Standardabweichung mit Matlab berechnet.
Temperatur Mittelwert: 75,4375 °F
Temperatur Standardabweichung: 2.1899 °F
Youtube-Video
Die Präsentation der Ergebnisse von diesem Projekt sind in dem Folgenden Video kurz zusammengefasst:
Zusammenfassung
Zusammenfassend lässt sich sagen, dass es nicht möglich war, den Sensor zu Kalibrieren. Das Hauptproblem dabei, war der Mangel an Informationen, da das Datenblatt nur wenige technische Details beinhaltete. Der Kundendienst des Herstellers konnte leider auch nicht weiterhelfen, wodurch experimentell die Funktionsweise ermittelt werden musste.
Ein weiteres Problem bestand im unzureichenden bzw. fehlendem Equipment (Klimaschrank und Referenzmessgeräte).
Die Mittelwerte und Standardabweichungen sind mit Vorsicht zu betrachten, da es vermutlich einen Fehler beim Auslesen gibt. Für diese Theorie sprechen die viele Werte, die neben den eigentlichen Messwerten geschickt werden. Wie diese Werte zu Stande kommen ist nicht klar. Für eine I²C Adresse sind es zu viele Werte, daher gilt es herauszufinden, was diese Werte bedeuten.
‘‘‘Fazit:‘‘‘ Es besteht Potential für Verbesserungen.
Ausblick
Zur Verbesserung sollte zunächst geklärt werden, was die „überflüssigen“ Zahlen zu bedeuten haben und wie genau der Sensor klare Werte liefert. Ggf. müsste der Sensor auseinander gebaut werden, um die Funktionsweise zu verstehen, sofern es nicht doch möglich ist mehr technische Informationen über den Sensor zu erhalten.
Für eine genauere Auswertung und eine daraus resultierende bessere Kalibrierung des Sensors ist es nötig, mit besserem Test-Equipment die Werte aufzunehmen. Ein Klimaschrank wäre an der Stelle optimal. Ansonsten bestände eine Verbesserung darin ein Vergleichs-Barometer bzw. Thermometer zu verwenden, welches mindestens eine genau so feine Messgenauigkeit, wie das NXT Barometer aufweist und darüber hinaus an den PC angeschlossen werden kann. Dadurch könnten die Vergleichswerte direkt mit einberechnet werden. Bei den verwendeten Vergleichsgerätschaften waren diese Messgenauigkeit und die Anschlussfunktion nicht gegeben. Das Behältnis sollte zudem 100% dicht sein, auch bei hohem Druck.
Hilfreiche Links
- NXT Barometer: http://www.hitechnic.com/cgi-bin/commerce.cgi?preadd=action&key=NBR1036 (Abgerufen am 03.07.2018)
- Matlab Toolbox: https://de.mathworks.com/hardware-support/lego-mindstorms-matlab.html (Abgerufen am 03.07.2018)
- Sigrok: https://sigrok.org/wiki/Protocol_decoders (Abgerufen am 03.07.2018)
- Arduino Connector: http://www.mindsensors.com/ev3-and-nxt/58-breadboard-connector-kit-for-nxt-or-ev3 (Abgerufen am 03.07.2018)
- I²C Scanner für Arduino: https://arduino-projekte.webnode.at/i2c-scanner/ (Abgerufen am 03.07.2018)
Quellenverzeichnis
- ↑ 1,0 1,1 1,2 NXT_Barometer. Abgerufen am 3. Juli 2018.
- ↑ I²C Sensor. Abgerufen am 3. Juli 2018.
- ↑ 3,0 3,1 I²C Kommunikation. Abgerufen am 3. Juli 2018.
- ↑ Pin Belegung. Abgerufen am 3. Juli 2018.
- ↑ Sigrok. Abgerufen am 3. Juli 2018.
- ↑ Wire.h - I²C auf Arduino. Abgerufen am 3. Juli 2018.
→ zurück zum Hauptartikel: Signalverarbeitende Systeme