simple CCS811 driver

Dependencies:   AMS_ENS210_temp_humid_sensor

Dependents:   TBSense2_Sensor_Demo

Fork of AMS_CCS811_gas_sensor by Marcus Lee

Files at this revision

API Documentation at this revision

Comitter:
Steven Cooreman
Date:
Tue Mar 05 20:18:27 2019 +0100
Parent:
14:0e8f5bf68b50
Commit message:
Added FW v2.0.0 for CCS811 and introduced usage of mbed_trace

Changed in this revision

AMS_CCS811.cpp Show annotated file Show diff for this revision Revisions of this file
AMS_CCS811.h Show annotated file Show diff for this revision Revisions of this file
AMS_CCS811_fw_2_0_0.h Show annotated file Show diff for this revision Revisions of this file
CCS811_FW_App_v2-0-0.bin Show annotated file Show diff for this revision Revisions of this file
diff -r 0e8f5bf68b50 -r cf658680c53f AMS_CCS811.cpp
--- a/AMS_CCS811.cpp	Thu May 04 13:08:54 2017 +0000
+++ b/AMS_CCS811.cpp	Tue Mar 05 20:18:27 2019 +0100
@@ -1,17 +1,21 @@
 
 #include "AMS_CCS811.h"
+#include "AMS_CCS811_fw_2_0_0.h"
+#include "mbed_trace.h"
+
+#define TRACE_GROUP "CCS"
 
 AMS_CCS811::AMS_CCS811(I2C * i2c, PinName n_wake_pin) : _n_wake_out(), _addr_out(), _int_data(), _ens210(), _i2c() {
     _n_wake_out = new (std::nothrow) DigitalOut(n_wake_pin, 1);
-    _i2c = i2c; 
+    _i2c = i2c;
 }
-            
+
 AMS_CCS811::AMS_CCS811(I2C * i2c, PinName n_wake_pin, I2C * ens210_i2c) : _n_wake_out(), _addr_out(), _int_data(), _ens210(), _i2c() {
     _n_wake_out = new (std::nothrow) DigitalOut(n_wake_pin, 1);
     _i2c = i2c;
     ens210_i2c_interface(ens210_i2c);
 }
-              
+
 AMS_CCS811::~AMS_CCS811() {
     delete _n_wake_out;
     delete _addr_out;
@@ -20,25 +24,54 @@
 }
 
 bool AMS_CCS811::init() {
-   
+
     bool success = false;
-    
-    
+
     _init_errors();
     _init_fractions();
     set_defaults();
-    
+
     temp_reading = 0;
     humid_reading = 0;
-    
+
     if (_n_wake_out) {
-    
+        char buffer[2];
+
+        if(i2c_read(HW_ID, buffer, 1) == 1) {
+            if(buffer[0] != 0x81) {
+                // not a CCS811
+                tr_err("Not a CCS: %02x", buffer[0]);
+                return false;
+            }
+        } else {
+            return false;
+        }
+
+        if(i2c_read(STATUS, buffer, 1) == 1) {
+            if((buffer[0] & 0x10) == 0) {
+                // does not have valid FW
+                flash_firmware();
+            }
+        } else {
+            return false;
+        }
+
+        if(i2c_read(FW_APP_VERSION, buffer, 2) == 2) {
+            tr_warn("CCS version %02x %02x", buffer[0], buffer[1]);
+            if (buffer[0] < CCS_FW_UPGRADE_VERSION) {
+                tr_warn("Flashing Firmware");
+                flash_firmware();
+            }
+        } else {
+            return false;
+        }
+
         int fw_mode = firmware_mode();
-       
-        if (fw_mode == 1) {  
+
+        if (fw_mode == 1) {
             success = write_config();
             enable_ens210(true);
-    
+
         } else if (fw_mode == 0) {  // is in boot mode, needs to be loaded into app mode
             if (boot_app_start())   // if succesfully writes to app_start, retry init
                 success = init();
@@ -48,33 +81,163 @@
     return success;
 }
 
+bool AMS_CCS811::flash_firmware() {
+    // kick into bootloader mode
+    int fw_mode = firmware_mode();
+    if (fw_mode == 1) {
+        const char reset_sequence[] = {0x11, 0xE5, 0x72, 0x8A};
+        if(i2c_write(0xFF, (char*)reset_sequence, 4) == 4) {
+            fw_mode = firmware_mode();
+            if(fw_mode == 1) {
+                tr_err("Couldn't exit app mode");
+                return false;
+            }
+        } else {
+            tr_err("Couldn't issue reset command");
+            return false;
+        }
+    }
+
+    // assert nwake
+    if (_n_wake_out != NULL) {
+        int write_count;
+
+        _n_wake_out->write(0);
+        wait_ms(100);
+
+        // erase current FW
+        static const char erase_sequence[4] = {0xE7, 0xA7, 0xE6, 0x09};
+        write_count = 0;
+        _i2c->start();
+        if(_i2c->write(CCS811_SLAVE_ADDR_W) == 1) {
+            if(_i2c->write(FW_ERASE) == 1) {
+                for (size_t i = 0; i < 4; i++) {
+                    if(_i2c->write(erase_sequence[i]) == 1) write_count++;
+                    else new_error(CCS811_LIB_I2CWRITE_ID);
+                }
+            } else new_error(CCS811_LIB_REG_ADDR_ID);
+        } else new_error(CCS811_LIB_SLAVE_W_ID);
+        _i2c->stop();
+
+        if (write_count != 4) {
+            _n_wake_out->write(1);
+            return false;
+        }
+        tr_info("CCS FW erased");
+        wait_ms(500);
+
+        // upload new FW
+        tr_info("uploading new FW");
+        char payload[8];
+        for(size_t offset = 0; offset < 5120; offset += 8) {
+            for(size_t j = 0; j < 8; j++) {
+                payload[j] = ams_fw_image[offset + j];
+            }
+
+            write_count = 0;
+            _i2c->start();
+            if(_i2c->write(CCS811_SLAVE_ADDR_W) == 1) {
+                if(_i2c->write(FW_FLASH) == 1) {
+                    for (size_t j = 0; j < 8; j++) {
+                        if(_i2c->write(payload[j]) == 1) write_count++;
+                        else new_error(CCS811_LIB_I2CWRITE_ID);
+                    }
+                } else new_error(CCS811_LIB_REG_ADDR_ID);
+            } else new_error(CCS811_LIB_SLAVE_W_ID);
+            _i2c->stop();
+
+            wait_ms(50);
+
+            if (write_count != 8) {
+                _n_wake_out->write(1);
+                tr_err("flash error");
+                return false;
+            }
+
+            tr_debug("Flashed byte %d of 5120", offset);
+        }
+        tr_info("CCS FW uploaded");
+
+        // verify new FW
+        write_count = 0;
+        _i2c->start();
+        if(_i2c->write(CCS811_SLAVE_ADDR_W) == 1) {
+            if(_i2c->write(FW_VERIFY) == 1) {
+                write_count = 1;
+            } else new_error(CCS811_LIB_REG_ADDR_ID);
+        } else new_error(CCS811_LIB_SLAVE_W_ID);
+        _i2c->stop();
+
+        wait_ms(500);
+
+        if (write_count != 1) {
+            _n_wake_out->write(1);
+            tr_err("Failed to issue verify");
+            return false;
+        }
+
+        char status = 0;
+        _i2c->start();
+        if(_i2c->write(CCS811_SLAVE_ADDR_W) == 1) {
+            if(_i2c->write(STATUS) == 1) {
+                _i2c->start();
+                if(_i2c->write(CCS811_SLAVE_ADDR_R) == 1) {
+                    status = _i2c->read(0);
+                } else new_error(CCS811_LIB_SLAVE_R_ID);
+            } else new_error(CCS811_LIB_REG_ADDR_ID);
+        } else new_error(CCS811_LIB_SLAVE_W_ID);
+        _i2c->stop();
+
+        if (status == 0) {
+            tr_err("Failed update");
+            _n_wake_out->write(1);
+            return false;
+        }
+
+        if ((status & 0x30) != 0x30) {
+            tr_err("Failed verify");
+            _n_wake_out->write(1);
+            return false;
+        }
+
+        // boot into new FW
+        tr_info("upgraded");
+        _n_wake_out->write(1);
+        wait_ms(50);
+        return boot_app_start();
+    } else {
+        tr_err("No nWAKE available");
+        return false;
+    }
+}
+
 void AMS_CCS811::i2c_interface(I2C * i2c) {
     _i2c = i2c;
 }
-        
+
 bool AMS_CCS811::ens210_i2c_interface(I2C * i2c) {
 
     bool success;
-   
+
     if (_ens210 == NULL) {
         _ens210 = new (std::nothrow) AMS_ENS210(i2c, true, true);
         if (_ens210 != NULL) {
             if (_ens210->init()) {
                 success = _ens210->start();
             }
-        } 
+        }
     } else {
         _ens210->i2c_interface(i2c);
         success = true;
     }
-    
+
     if (!success) new_error(CCS811_LIB_ENS210_INIT_ID);
-    
+
     return success;
 }
 
 bool AMS_CCS811::enable_ens210(bool enable) {
-    
+
     _ens210_enabled = false;
     if (_ens210 != NULL) {
         if (_ens210->i2c_interface() != NULL) _ens210_enabled = enable;
@@ -87,7 +250,7 @@
     enable_ens210(_ens210_enabled);     // Make sure the state is representive
     return _ens210_enabled;
 }
-        
+
 void AMS_CCS811::ens210_poll_interval(int poll_ms) {
     _ens210_poll_split = poll_ms;
     enable_ens210(_ens210_enabled);     // makes sure the state is representive, and will also update the timer
@@ -99,66 +262,66 @@
 
 int AMS_CCS811::firmware_mode() {
     int firmware_result = -1;
-    
+
     clear_errors();
-    
+
     read_byte_result read_result = read_status();
     if (read_result.success) {
         firmware_result = (read_result.byte >> 7) & 1;
     }
-    
+
     return firmware_result;
 }
 
 bool AMS_CCS811::mode(OP_MODES mode) {
     clear_errors();
-    
+
     OP_MODES old = _mode;               // incase the write fails, to roll back
     _mode = mode;
-    
+
     bool success = write_config();
     if (!success)
         _mode = old;
-    
+
     return success;
 }
 
 AMS_CCS811::OP_MODES AMS_CCS811::mode() {
     clear_errors();
-    
+
     OP_MODES result = INVALID;
-    
+
     read_byte_result read_result = read_config();
     if (read_result.success) {
         int mode = (read_result.byte >> 4) & 0b111;
         result = mode > 4 ? INVALID : (OP_MODES)mode;
     }
-    
+
     return result;
 }
 
-bool AMS_CCS811::addr_mode(bool high) { 
+bool AMS_CCS811::addr_mode(bool high) {
     _addr_dir = high;
     if (_addr_out != NULL) _addr_out->write(_addr_dir);
-    
+
     update_slave_addr();
-    
+
     return addr_mode() == high;
 }
 
 bool AMS_CCS811::addr_mode() {
     _addr_dir = false;
     if (_addr_out != NULL) {
-        _addr_dir = _addr_out->read(); 
+        _addr_dir = _addr_out->read();
     }
-    
+
     return _addr_dir;
 }
 
 bool AMS_CCS811::addr_pin(PinName pin) {
     _addr_out = _addr_out == NULL ? new (std::nothrow) DigitalOut(pin) : new (_addr_out) DigitalOut(pin);
     addr_mode(_addr_dir);
-    
+
     return _addr_out != NULL;
 }
 
@@ -171,14 +334,14 @@
     char bytes[4];
     if (humid > CCS811_MAX_HUMID) humid = CCS811_MAX_HUMID;
     if (humid < 0) humid = 0;
-        
+
     temp += 25;
     if (temp > CCS811_MAX_TEMP) humid = CCS811_MAX_TEMP;
     if (temp < 0) temp = 0;
-    
+
     float_to_short(humid, bytes);
     float_to_short(temp, bytes+2);
-    
+
     return i2c_write(ENV_DATA, bytes, 4) == 4;
 }
 
@@ -186,30 +349,30 @@
 int AMS_CCS811::has_new_data() {
 
     clear_errors();
-    
+
     int result = -1;
-    
+
     char meas_mode[1];
     if(i2c_read(MEAS_MODE, meas_mode, 1) == 1) {                                // one read here is quicker than calling read_config() twice
-    
+
         int curr_mode = (meas_mode[0] >> 4) & 0b111;
         if (curr_mode < 5) {
             if (curr_mode > 0) {                                                // check for all valid modes other than idle
                 if (((meas_mode[0] >> 3) & 1) == 0) {                           // check if interrupts are disabled
-                    char status[1];                     
+                    char status[1];
                     if (i2c_read(STATUS, status, 1) == 1)                       // for some reason the status register in ALG_RESULT_DATA is not updated after reading data, however the STATUS register is
                         result = (status[0] >> 3) & 1;
-                
+
                 } else result = 1;
-                
-                if (result == 1) 
+
+                if (result == 1)
                     if (i2c_read(ALG_RESULT_DATA, _alg_result_data, 8) != 8) result = -1;
-                
-  
+
+
             } else result = 0;                                                  // return 0 when in idle
         } else new_error(CCS811_LIB_INV_MODE_ID);
     }
-    
+
     return result;
 }
 
@@ -235,20 +398,20 @@
 
 bool AMS_CCS811::error_status() {
     bool result = false;
-    
+
     read_byte_result read_result = read_status();
     if (read_result.success) {
         result = read_result.byte & 1;
     }
-    
+
     result = result || (_error_count > 0);
-    
+
     return result;
 }
-      
+
 AMS_CCS811::ccs811_errors AMS_CCS811::errors() {
     ccs811_errors error_result;
-    
+
     char byte[1];
     if (i2c_read(ERROR_ID, byte, 1) == 1) {
         for(int i = 0; i < CCS811_ERR_NUM; i++) {
@@ -262,54 +425,54 @@
             error_result.codes[error_result.count++] = i + CCS811_ERR_NUM;
         }
     }
-    
+
     return error_result;
-    
+
 }
 
 const char * AMS_CCS811::error_string(int err_code){
     static char result[255];
     result[0] = 0;
-    if (err_code < CCS811_TOTAL_ERR_NUM && err_code > -1) 
+    if (err_code < CCS811_TOTAL_ERR_NUM && err_code > -1)
         strcpy(result, _error_strings[err_code]);
-    else 
+    else
         sprintf(result, "Invalid Code: %d is out of range (0 - %d)", err_code, CCS811_TOTAL_ERR_NUM-1);
-    
+
     return result;
 }
 
 bool AMS_CCS811::enable_interupt(bool enable) {
     bool old = _int_data_enabled;   // incase the write fails, to roll back
     _int_data_enabled = enable;
-    
+
     bool success = write_config();
     if (!success)
         _int_data_enabled = old;
-    
+
     return success;
 
 }
 
 int AMS_CCS811::interupt_enabled() {
     int enabled = -1;
-    
+
     read_byte_result read_result = read_config();
     if (read_result.success) {
         enabled = (read_result.byte >> 3) & 1;
     }
-    
+
     return enabled;
 }
 
 bool AMS_CCS811::interrupt_pin(PinName pin) {
     bool success = false;
-    
+
     _int_data = _int_data == NULL ? new (std::nothrow) InterruptIn(pin) : new (_int_data) InterruptIn(pin);
     if (_int_data != NULL) {
         _int_data->fall(callback(this, &AMS_CCS811::_isr_data));
         success = true;
     }
-    
+
     return success;
 }
 
@@ -319,7 +482,7 @@
 /** Private **/
 
 void AMS_CCS811::set_defaults() {
-    if (_mode == NULL) 
+    if (_mode == NULL)
         _mode = CONFIG_OP_MODE;
     if (_addr_dir == NULL)
         _addr_dir = CONFIG_ADDR_DIR;
@@ -327,7 +490,7 @@
         _int_data_enabled = CONFIG_INTR;
     if (_ens210_poll_split == NULL)
         _ens210_poll_split = CONFIG_ENS210_POLL;
-        
+
     update_slave_addr();
 }
 
@@ -380,7 +543,7 @@
 }
 
 void AMS_CCS811::_init_fractions() {
-    
+
     fractions[0] = 0.5;
     fractions[1] = 0.25;
     fractions[2] = 0.125;
@@ -390,7 +553,7 @@
     fractions[6] = 0.0078125;
     fractions[7] = 0.00390625;
     fractions[8] = 0.001953125;
-    
+
 }
 
 void AMS_CCS811::float_to_short(float in, char * output) {
@@ -400,15 +563,15 @@
 
     uint16_t _short = 0;
     for (int i = 0; i < 9; i++) {
-        if (dec_part == 0) break;  
+        if (dec_part == 0) break;
         if (dec_part >= fractions[i]) {
             dec_part -= fractions[i];
             _short |= 256 >> i;
         }
     }
-    
+
     _short |= int_part << 9;
-    
+
     output[0] = _short >> 8;
     output[1] = _short;
 }
@@ -416,7 +579,7 @@
 void AMS_CCS811::update_slave_addr() {
     _slave_addr = addr_mode() ? CCS811_SLAVE_ADDR_RAW_H : CCS811_SLAVE_ADDR_RAW_L;
 }
-        
+
 void AMS_CCS811::_isr_data() {
     has_new_data();             // populate the data array
     _isr_data_fp.call();
@@ -444,26 +607,26 @@
         result.success = true;
         result.byte = byte[0];
     }
-    
+
     return result;
 }
 
 bool AMS_CCS811::boot_app_start() {
     bool success = false;
-    
+
     if (i2c_write(APP_START, NULL, 0) == 0) {
         wait_ms(70);
         success = true;
     }
-    
+
     return success;
 }
 
 int AMS_CCS811::i2c_read(char reg_addr, char* output, int len) {
 
     int read_count = 0;
-    if (_n_wake_out != NULL) {                                          // check nWAKE pin is set 
-        _n_wake_out->write(0);                                          // Hold low 
+    if (_n_wake_out != NULL) {                                          // check nWAKE pin is set
+        _n_wake_out->write(0);                                          // Hold low
         wait_us(CCS811_T_AWAKE);                                        // tAWAKE time to allow sensor I2C to wake up
         if (_i2c != NULL) {                                             // check I2C interface is set
             _i2c->start();                                              // send start condition for write
@@ -478,17 +641,17 @@
                     } else new_error(CCS811_LIB_SLAVE_R_ID);
                 } else new_error(CCS811_LIB_REG_ADDR_ID);
             } else new_error(CCS811_LIB_SLAVE_W_ID);
-            _i2c->stop();                                               // send stop condition 
+            _i2c->stop();                                               // send stop condition
         } else new_error(CCS811_LIB_I2C_ID);
         _n_wake_out->write(1);                                          // Set back to high
         wait_us(CCS811_T_DWAKE);                                        // tDWAKE time to allow sensor I2C to sleep
     } else new_error(CCS811_LIB_N_WAKE_ID);
-    
+
     return read_count;
 }
 
 int AMS_CCS811::i2c_write(char reg_addr, char* input, int len) {
-    
+
     int write_count = -1;
     if (_n_wake_out != NULL) {                                          // check nWAKE pin is set
         _n_wake_out->write(0);                                          // Hold low
@@ -504,11 +667,11 @@
                     }
                 } else new_error(CCS811_LIB_REG_ADDR_ID);
             } else new_error(CCS811_LIB_SLAVE_W_ID);
-            _i2c->stop();                                               // send stop condition 
+            _i2c->stop();                                               // send stop condition
         } else new_error(CCS811_LIB_I2C_ID);
         _n_wake_out->write(1);                                          // set back to high
         wait_us(CCS811_T_DWAKE);                                        // tDWAKE time to allow sensor I2C to sleep
     }else new_error(CCS811_LIB_N_WAKE_ID);
-    
+
     return write_count;
 }
\ No newline at end of file
diff -r 0e8f5bf68b50 -r cf658680c53f AMS_CCS811.h
--- a/AMS_CCS811.h	Thu May 04 13:08:54 2017 +0000
+++ b/AMS_CCS811.h	Tue Mar 05 20:18:27 2019 +0100
@@ -21,9 +21,9 @@
 #define CCS811_SLAVE_ADDR_RAW_H     0x5B
 #define CCS811_SLAVE_ADDR_RAW_L     0x5A
 #define CCS811_SLAVE_ADDR_RAW       _slave_addr
-#define CCS811_SLAVE_ADDR           CCS811_SLAVE_ADDR_RAW << 1     
+#define CCS811_SLAVE_ADDR           CCS811_SLAVE_ADDR_RAW << 1
 #define CCS811_SLAVE_ADDR_W         CCS811_SLAVE_ADDR
-#define CCS811_SLAVE_ADDR_R         CCS811_SLAVE_ADDR | 1          
+#define CCS811_SLAVE_ADDR_R         CCS811_SLAVE_ADDR | 1
 
 #define MEAS_MODE                   0x01
 #define STATUS                      0x00
@@ -33,6 +33,13 @@
 #define ENV_DATA                    0x05
 #define ERROR_ID                    0xE0
 
+#define HW_ID                       0x20
+#define HW_VERSION                  0x21
+#define FW_BOOT_VERSION             0x23
+#define FW_APP_VERSION              0x24
+#define FW_ERASE                    0xF1
+#define FW_FLASH                    0xF2
+#define FW_VERIFY                   0xF3
 #define APP_START                   0xF4
 
 #define CCS811_T_AWAKE              55                      // us - time taken for sensor I2C to become active
@@ -92,24 +99,24 @@
             CONSTANT,       /**< Measurement every 250ms - Only raw data available */
             INVALID         /**< Invalid bit configuration/Error Occured */
         };
-    
+
         /** Holds error information.
          *
          */
         struct ccs811_errors {
             int count;                          /**< Number of total errors */
             int codes[CCS811_TOTAL_ERR_NUM];    /**< Array of active error codes */
-            
+
             ccs811_errors() : count(0) {}
         };
-    
+
         /** Create an AMS_CCS811 instance
          *
          * @param i2c           The I2C interface to use for communication
          * @param n_wake_pin    Pin nWAKE is attached to
          */
         AMS_CCS811(I2C * i2c, PinName n_wake_pin);
-        
+
         /** Create an AMS_CCS811 instance
          *
          * @param i2c           The I2C interface to use for communication
@@ -117,24 +124,30 @@
          * @param ens210_i2c    The I2C interface for an attached AMS_ENS210
          */
         AMS_CCS811(I2C * i2c, PinName n_wake_pin, I2C * ens210_i2c);
-        
+
         /** Destroy the AMS_CCS811 instance
          */
         ~AMS_CCS811();
-    
+
         /** Initalise the sensor
          *
          * @return Intalisation success
          */
         bool init();
-        
+
+        /** Overwrite the sensor's firmware
+         *
+         * @return upload success
+         */
+        bool flash_firmware();
+
         /** Set the I2C interface
          *
          * @param i2c  The I2C interface to use for communication
          *
          */
         void i2c_interface(I2C * i2c);
-        
+
         /** Set the ENS210 I2C interface
          *
          * @param i2c  The I2C interface for an attached AMS_ENS210
@@ -142,42 +155,42 @@
          * @return Success
          */
         bool ens210_i2c_interface(I2C * i2c);
-        
+
         /** Set whether the attached AMS_ENS210 is enabled.
          *  If an I2C interface is not set for the ENS210, calling this method will have no effect.
-         * 
+         *
          * @param enabled   True for enabled, false for disabled
          *
          * @return enabled  True for enabled, false for disabled
          */
         bool enable_ens210(bool enable);
-        
+
         /** Get whether the attached AMS_ENS210 is enabled.
-         * 
+         *
          * @return enabled    True for enabled, false for disabled
          *
          */
         bool ens210_is_enabled();
-        
+
         /** Set the AMS_ENS210 poll interval
          *
          * @param poll_ms  Poll interval in ms
          *
          */
         void ens210_poll_interval(int poll_ms);
-    
+
         /** Get the AMS_ENS210 poll interval
          *
          * @return The poll interval in ms
          */
         int ens210_poll_interval();
-        
+
         /** Get the current firmware mode
          *
          * @return 1 application mode, 0 for boot mode, -1 for error
          */
         int firmware_mode();
-    
+
         /** Set the operation mode \n
          * Notes: \n 1.\ When a sensor operating mode is changed to a new mode with\n
          *          a lower sample rate (e.g.\ from SECOND to SIXTY_SECOND), it should be\n
@@ -193,13 +206,13 @@
          * @return Write success
          */
         bool mode(OP_MODES mode);
-    
+
         /** Get the current power mode
          *
          * @return The current OP_MODES mode
          */
         AMS_CCS811::OP_MODES mode();
-        
+
         /** Set the ADDR mode \n
          *
          * @param high  True sets to high, false to low
@@ -207,13 +220,13 @@
          * @return Write success
          */
         bool addr_mode(bool high);
-    
+
         /** Get the the ADDR mode
          *
          * @return The current ADDR mode, true for high, false for low
          */
         bool addr_mode();
-        
+
         /** Set the ADDR pin
          *
          * @param pin    Pin ADDR is attached to
@@ -221,13 +234,13 @@
          * @return Write success
          */
         bool addr_pin(PinName pin);
-    
+
         /** Get the the ADDR pin
          *
          * @return The addr pin
          */
         PinName addr_pin();
-        
+
         /** Set the nWAKE pin
          *
          * @param pin    Pin nWAKE is attached to
@@ -235,13 +248,13 @@
          * @return Write success
          */
         bool n_wake_pin(PinName pin);
-    
+
         /** Get the the nWAKE pin
          *
          * @return The nWAKE pin
          */
         PinName n_wake_pin();
-        
+
         /** Set the relative humidity (%) and temperature (C).\ \n
          *  Use when AMS ENS210 is not linked.\ \n
          *  Humidity values are clipped between 0 and CCS811_MAX_HUMID.\ \n
@@ -250,28 +263,28 @@
          * @return Write success
          */
         bool env_data(float humid, float temp);
-        
+
         /** Get the sensor collection state
          *  Use when interrupts are disabled.
          *
          * @return Current collection state, 1 for new data ready, 0 for data not ready and -1 for error
          */
         int has_new_data();
-    
+
         /** Get the most recent CO2 measurement.\ \n
          *  Must call has_new_data() first when when interupts are disabled otherwise the same data will be returned
          *
          * @return Most recent eCO2 measurement in ppm
          */
         uint16_t co2_read();
-    
+
         /** Get the most recent TVOC measurement.\ \n
          *  Must call has_new_data() first when when interupts are disabled otherwise the same data will be returned
          *
          * @return Most recent TVOC measurement in ppb
          */
         uint16_t tvoc_read();
-    
+
         /** Get the most recent RAW data.\ \n
          *  Must call has_new_data() first when NOT in CONSTANT mode and interupts are disabled otherwise the same data will be returned.\ \n
          *  When in CONSTANT mode only this read method will return anything other than 0 or NULL.\ If 0 is returned, check for errors.
@@ -279,33 +292,33 @@
          * @return Most recent RAW data
          */
         uint16_t raw_read();
-        
+
         /** Get the most recent Tempurature(C) measurement from the ENS210 (if attached and enabled).\ \n
          *  Will be at most as old as the ENS210 poll time
          *
          * @return Most recent Tempurature(C) measurement from the ENS210
          */
         float temp_read();
-        
+
         /** Get the most recent Relative Humidity(%) measurement from the ENS210 (if attached and enabled).\ \n
          *  Will be at most as old as the ENS210 poll time
          *
          * @return Most recent Relative Humidity(%) measurement from the ENS210
          */
         float humid_read();
-        
+
         /** Get current error status
          *
-         * @return True when error has occured, false when no error has occured 
+         * @return True when error has occured, false when no error has occured
          */
         bool error_status();
-        
+
         /** Get the latest errors.
          *
          * @return Latest errors.
          */
         ccs811_errors errors();
-    
+
         /** Get the error string.
          *
          * @param err_code  Error code to be translated
@@ -313,7 +326,7 @@
          * @return Error String.
          */
         const char * error_string(int err_code);
-    
+
         /** Attach a function to be called when data is ready.
          *  Calling this method enables interupts
          *
@@ -327,7 +340,7 @@
             interrupt_pin(pin);
             return enable_interupt(true);
         }
-    
+
         /** Attach a member function to be called when data is ready.
          *  Calling this method enables interupts
          *
@@ -343,24 +356,24 @@
             interrupt_pin(pin);
             return enable_interupt(true);
         }
-    
+
         /** Set whether the data ready interupt is enabled.\ \n
          *  Note: If this method fails, the state of the config register cannot be guaranteed.\ \n
-         *  Check errors and ensure all config settings are as expected. 
-         * 
+         *  Check errors and ensure all config settings are as expected.
+         *
          * @param enabled    True for enabled, false for disabled
          *
          * @return Write success
          */
         bool enable_interupt(bool enable);
-        
+
         /** Get whether the data ready interupt is enabled.
-         * 
+         *
          *
          * @return 1 for enabled, 0 for disabled, -1 for error
          */
         int interupt_enabled();
-        
+
         /** Set the nINT pin
          *
          * @param pin    Pin nINT is attached to
@@ -368,23 +381,23 @@
          * @return Write success
          */
         bool interrupt_pin(PinName pin);
-    
+
         /** Get the the nINT pin
          *
          * @return The nINT pin
          */
         PinName interrupt_pin();
-    
-    
-    
-    
+
+
+
+
     private:
         I2C* _i2c;
-        
+
         bool _addr_dir;
         int _slave_addr;
         void update_slave_addr();
-        
+
         AMS_ENS210 *_ens210;
         bool _ens210_enabled;
         int _ens210_poll_split;
@@ -393,34 +406,34 @@
         void ens210_isr();
         float temp_reading;
         float humid_reading;
-        
+
         float fractions[9];
         void _init_fractions();
         void float_to_short(float in, char * output);
-        
+
         OP_MODES _mode;
-        
+
         void set_defaults();
-        
+
         bool _errors[CCS811_LIB_ERR_NUM];
         int _error_count;
         char _error_strings[CCS811_TOTAL_ERR_NUM][255];
         void _init_errors();
         void clear_errors();
         void new_error(int error_id);
-        
+
         DigitalOut *_n_wake_out;
         DigitalOut *_addr_out;
-        
+
         char _alg_result_data[8];
-        
+
         FunctionPointer _isr_data_fp;
         bool _int_data_enabled;
         InterruptIn *_int_data;
         void _isr_data();
-    
+
         bool write_config();
-        
+
         struct read_byte_result {
             bool success;
             uint8_t byte;
@@ -428,9 +441,9 @@
         };
         read_byte_result read_config();
         read_byte_result read_status();
-        
+
         bool boot_app_start();
-        
+
         int i2c_read(char reg_addr, char* output, int len);
         int i2c_write(char reg_addr, char* input, int len);
 
diff -r 0e8f5bf68b50 -r cf658680c53f AMS_CCS811_fw_2_0_0.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/AMS_CCS811_fw_2_0_0.h	Tue Mar 05 20:18:27 2019 +0100
@@ -0,0 +1,333 @@
+/**
+* @section DESCRIPTION
+*    A firmware upgrade file for the AMS CCS811 sensor
+*
+*/
+#ifndef AMS_CCS811_FW_H
+#define AMS_CCS811_FW_H
+
+#define CCS_FW_UPGRADE_VERSION 0x20
+static const char ams_fw_image[5120] = {
+	0x5C, 0x1A, 0xDD, 0xFF, 0x15, 0x25, 0xDD, 0x66, 0xFC, 0x88, 0x80, 0x49, 0x02, 0xDC, 0x17, 0x10,
+  0x1F, 0x73, 0x60, 0xAE, 0xF4, 0xA0, 0x5D, 0xDA, 0xCD, 0xCA, 0x94, 0xC6, 0x6B, 0x96, 0x4F, 0xEA,
+  0xED, 0xBD, 0xDE, 0xC2, 0xEA, 0xC1, 0x44, 0x8B, 0xF3, 0x7A, 0x4D, 0x61, 0x22, 0x83, 0xE5, 0xAC,
+  0x3C, 0xB1, 0x44, 0x5F, 0x91, 0xA2, 0xDC, 0xD2, 0x40, 0x63, 0x1C, 0x11, 0x60, 0x10, 0x33, 0xE7,
+  0x05, 0x47, 0xC0, 0x06, 0xE4, 0xBC, 0x91, 0x41, 0x21, 0x25, 0x6F, 0xB1, 0x1E, 0x5E, 0x81, 0x1E,
+  0xF6, 0xFA, 0x59, 0x1D, 0xCE, 0x74, 0xED, 0x15, 0x17, 0xE7, 0xD0, 0x2D, 0xDE, 0xD4, 0x6C, 0x72,
+  0x19, 0xDB, 0x89, 0x0E, 0x05, 0x76, 0x3D, 0x9E, 0xB6, 0xDA, 0xF9, 0x08, 0x54, 0xB0, 0x0D, 0x4A,
+  0x9F, 0x2C, 0xDA, 0xC7, 0xCE, 0xDA, 0x09, 0xDD, 0x38, 0x41, 0xF9, 0x95, 0xCC, 0x91, 0x82, 0x8F,
+  0xC4, 0xA3, 0x9C, 0xC1, 0xEB, 0x9F, 0xA5, 0x75, 0x80, 0x65, 0x4C, 0xFB, 0xE2, 0x69, 0xAC, 0xD0,
+  0x3C, 0x7E, 0x39, 0x36, 0xA8, 0x4B, 0xF8, 0xE9, 0x44, 0x08, 0xE1, 0x86, 0xEA, 0xE4, 0x5D, 0x21,
+  0x57, 0xA0, 0xE6, 0xC9, 0x8B, 0x28, 0x7F, 0x53, 0x41, 0xB8, 0xAE, 0x1E, 0x4B, 0x32, 0xD5, 0xED,
+  0x29, 0x04, 0x83, 0x5C, 0x16, 0xB5, 0xF8, 0x3D, 0xF5, 0xE4, 0xA8, 0xE2, 0xF0, 0xC9, 0x08, 0x90,
+  0xE4, 0xAB, 0x03, 0x60, 0xCB, 0xF8, 0xCA, 0x2F, 0xF3, 0x50, 0x5D, 0x9D, 0x28, 0x30, 0x32, 0x3B,
+  0x59, 0x6A, 0x70, 0xF1, 0x00, 0x77, 0xB3, 0xA2, 0xD8, 0x7B, 0xB3, 0xA7, 0xD8, 0x71, 0x1C, 0xEC,
+  0x32, 0x0C, 0xE5, 0xC7, 0x64, 0x5A, 0xA9, 0x7B, 0x72, 0xD5, 0x16, 0x31, 0xE7, 0xD9, 0x71, 0xD9,
+  0xBD, 0x42, 0x5C, 0x91, 0x67, 0xC2, 0x51, 0xBE, 0xD8, 0x5A, 0x3C, 0x84, 0x24, 0x09, 0xDC, 0xC2,
+  0xDB, 0xB9, 0x8E, 0x63, 0xC3, 0x8C, 0x94, 0xD4, 0xD0, 0xFE, 0xF6, 0xC2, 0xB2, 0x2C, 0xEC, 0xD2,
+  0x56, 0x52, 0x65, 0x45, 0x24, 0x24, 0x32, 0x51, 0x99, 0xD2, 0x80, 0x87, 0x02, 0xFF, 0x71, 0x3B,
+  0x92, 0x4F, 0x3D, 0xF7, 0x8C, 0x40, 0x46, 0x8A, 0x25, 0x3B, 0x3A, 0x59, 0x9E, 0x2F, 0xC5, 0xFF,
+  0xDC, 0x8E, 0x64, 0xA8, 0x5A, 0xC0, 0xF8, 0x40, 0xE6, 0x09, 0xAD, 0x03, 0x0B, 0xF4, 0xE6, 0xE3,
+  0x73, 0xF9, 0x91, 0x9D, 0xB0, 0x30, 0x59, 0xD3, 0x6B, 0x4E, 0xA4, 0x72, 0xD6, 0x5D, 0x9B, 0xD6,
+  0x83, 0x8A, 0xCC, 0xF6, 0x45, 0x45, 0xA0, 0x70, 0xE1, 0x0B, 0xB2, 0xAB, 0x01, 0x59, 0x51, 0xCB,
+  0x91, 0x7B, 0x94, 0x0F, 0xFB, 0xAD, 0x74, 0x96, 0x83, 0x06, 0xA1, 0xB2, 0x8B, 0x8B, 0xD5, 0xE6,
+  0x98, 0x7E, 0xEC, 0xCB, 0x38, 0x13, 0xAF, 0x00, 0xCE, 0xE9, 0xA2, 0x2E, 0xD1, 0xDD, 0xEA, 0xFC,
+  0xA2, 0xBB, 0x2F, 0xB0, 0xAD, 0x90, 0x4A, 0xC6, 0xC8, 0x93, 0xF8, 0x10, 0x24, 0x3D, 0xB4, 0x87,
+  0xF5, 0xCD, 0x27, 0xDD, 0xAF, 0x3C, 0x35, 0x16, 0x5E, 0x0D, 0x38, 0x8E, 0xE3, 0x39, 0x7C, 0xD6,
+  0xF4, 0x28, 0xC4, 0x71, 0x1C, 0xE6, 0x30, 0xF9, 0xEF, 0x01, 0x7D, 0xF4, 0x79, 0x4C, 0x51, 0x93,
+  0x7C, 0x78, 0xC1, 0x29, 0x11, 0xCB, 0xB5, 0xC1, 0x7F, 0x3D, 0xEA, 0xF6, 0x6B, 0xDA, 0x02, 0xE5,
+  0x78, 0x56, 0x67, 0x21, 0xE2, 0xD8, 0xBE, 0x7C, 0x09, 0xFA, 0x1D, 0xC9, 0xE4, 0x64, 0xD3, 0x95,
+  0xA6, 0x11, 0x87, 0x1E, 0x72, 0x25, 0x91, 0x01, 0x1F, 0xF4, 0x3A, 0xEC, 0x15, 0xD9, 0x09, 0x62,
+  0x02, 0xEE, 0xA1, 0x57, 0x8B, 0x30, 0xD1, 0x3D, 0x40, 0x56, 0xC0, 0x99, 0x47, 0x06, 0x68, 0x99,
+  0x9A, 0x90, 0x7D, 0xAC, 0x82, 0x75, 0x24, 0xEB, 0xE4, 0xC5, 0x7D, 0xAC, 0xD8, 0xF3, 0xE6, 0xD5,
+  0x87, 0x8A, 0x19, 0x6F, 0x70, 0xA2, 0xC6, 0xDA, 0xEF, 0x7D, 0x2B, 0x18, 0xFD, 0xF2, 0x40, 0x71,
+  0xBC, 0x58, 0x68, 0x79, 0x7B, 0xD8, 0x86, 0xB0, 0x76, 0x59, 0x3A, 0xF9, 0x65, 0xFC, 0x36, 0x34,
+  0x30, 0x7A, 0x79, 0x55, 0x69, 0xD2, 0xB0, 0x3F, 0x17, 0x74, 0x0B, 0x0F, 0x28, 0xB6, 0x46, 0x35,
+  0x35, 0x77, 0x4F, 0x83, 0x0E, 0xE3, 0xDD, 0x2D, 0xA1, 0x01, 0x4C, 0x72, 0x83, 0xD2, 0xD3, 0x60,
+  0x29, 0x76, 0x97, 0x99, 0x9C, 0x03, 0x73, 0x0A, 0x1D, 0xFB, 0xB9, 0xD0, 0xED, 0x6C, 0x17, 0x15,
+  0x40, 0x75, 0xD3, 0x67, 0x7D, 0x28, 0xF4, 0x10, 0x9A, 0x42, 0x7A, 0xD6, 0x0F, 0x87, 0xA5, 0xC2,
+  0xDA, 0xC2, 0x93, 0xB9, 0xA5, 0x23, 0xFC, 0x1D, 0x62, 0x63, 0xAE, 0x61, 0x65, 0xF6, 0xBC, 0xA5,
+  0x13, 0xA2, 0x9C, 0x0F, 0xBA, 0x28, 0x04, 0x5D, 0xE3, 0x98, 0x4F, 0x53, 0x06, 0xED, 0x70, 0x30,
+  0x65, 0x1E, 0x1A, 0x72, 0xBC, 0xE3, 0x32, 0x2D, 0x21, 0x39, 0xEE, 0x09, 0xBA, 0x3D, 0x0C, 0xD9,
+  0x86, 0x01, 0x8B, 0xF4, 0x33, 0x40, 0xA4, 0x82, 0x0B, 0x00, 0x29, 0xCA, 0x39, 0x0F, 0xD3, 0x6E,
+  0x5B, 0xFC, 0x22, 0xDF, 0x6D, 0x66, 0x32, 0x35, 0x45, 0x8F, 0x3B, 0x1D, 0xBA, 0xA8, 0xD6, 0x8D,
+  0x43, 0x60, 0x4C, 0x9C, 0xA6, 0x83, 0xBC, 0x66, 0x8F, 0x51, 0x98, 0x55, 0x7A, 0x99, 0x54, 0x76,
+  0xC1, 0x92, 0x9C, 0x3B, 0xE6, 0x3A, 0x67, 0x60, 0x9B, 0x80, 0xD5, 0xFC, 0x25, 0x8D, 0xF2, 0x20,
+  0xC3, 0xFC, 0x18, 0xED, 0x0F, 0x7F, 0x71, 0x42, 0x48, 0xB4, 0x40, 0xBE, 0x34, 0x81, 0x86, 0xB4,
+  0x39, 0x4F, 0x06, 0xA8, 0x3E, 0x17, 0x68, 0xCE, 0x01, 0xCF, 0x22, 0x64, 0xFB, 0x88, 0x04, 0xD8,
+  0x73, 0xDA, 0xCB, 0x0F, 0xF0, 0xA7, 0xB0, 0x9E, 0x1B, 0x54, 0x3E, 0x40, 0xD3, 0xC8, 0xCC, 0x17,
+  0x2E, 0x19, 0x54, 0x69, 0x6B, 0xE9, 0x4D, 0x2B, 0x40, 0x54, 0xBB, 0x75, 0xEC, 0x75, 0xFF, 0xEC,
+  0xAE, 0x60, 0x58, 0x6C, 0xE6, 0x6A, 0xBC, 0xFF, 0x95, 0x32, 0xE0, 0x76, 0x0E, 0x87, 0xC4, 0x83,
+  0x01, 0xFF, 0x74, 0x91, 0x58, 0xB7, 0x19, 0xFD, 0x0B, 0x64, 0x4F, 0xFD, 0x83, 0x6C, 0x85, 0xD8,
+  0x84, 0x6B, 0x67, 0x6F, 0xFB, 0x40, 0x93, 0x20, 0x61, 0x9C, 0x88, 0x51, 0x75, 0xF9, 0xEE, 0xDD,
+  0xD2, 0x24, 0xC0, 0xF4, 0x01, 0x65, 0xA4, 0xB4, 0xB9, 0xB4, 0x4B, 0xCD, 0x30, 0x93, 0x77, 0xF4,
+  0xC2, 0xAA, 0xE2, 0x3B, 0xA5, 0xB9, 0x75, 0xC0, 0xED, 0xD1, 0x0B, 0xEA, 0x63, 0xB4, 0xFA, 0xE7,
+  0x4D, 0x46, 0x56, 0x83, 0xA3, 0x64, 0x50, 0xD1, 0x29, 0xE5, 0x65, 0xEF, 0xB3, 0x27, 0x14, 0x6E,
+  0xE3, 0xCD, 0x0F, 0x19, 0x07, 0x55, 0x88, 0x91, 0x8B, 0x5F, 0xDA, 0x21, 0x9C, 0xAC, 0x92, 0x8B,
+  0xB4, 0xFA, 0x1A, 0xB3, 0xEE, 0x12, 0x04, 0xD3, 0x8E, 0x3A, 0x70, 0xD2, 0xA9, 0x86, 0x2F, 0xAA,
+  0x8D, 0x22, 0xD3, 0x9F, 0x82, 0xCF, 0xBE, 0x9B, 0x88, 0x35, 0xB0, 0x9E, 0x3B, 0xAC, 0x16, 0x78,
+  0x3A, 0xC8, 0x4D, 0x69, 0x05, 0x61, 0xCB, 0x87, 0x97, 0xC5, 0x2D, 0xCA, 0x4F, 0x81, 0xCC, 0xA7,
+  0x14, 0xA7, 0x88, 0xF6, 0xD0, 0xF7, 0x0E, 0xEB, 0xD3, 0x9D, 0xF5, 0xD3, 0xA8, 0x9E, 0x73, 0xB4,
+  0x74, 0xA1, 0xFD, 0x8E, 0xEA, 0x72, 0xDC, 0x24, 0x20, 0x1A, 0x70, 0xA1, 0x92, 0x3B, 0x42, 0xE0,
+  0x24, 0xBF, 0x57, 0xB1, 0x17, 0x92, 0xDF, 0x48, 0xFB, 0x91, 0x2F, 0x09, 0x96, 0x9D, 0x2A, 0x9F,
+  0xC9, 0xF8, 0x78, 0xD0, 0x1E, 0xF6, 0x14, 0x03, 0x1C, 0x7E, 0x1E, 0x0E, 0xB3, 0x74, 0xA4, 0x3E,
+  0x43, 0x48, 0x7A, 0xA8, 0x94, 0x47, 0xD5, 0x6F, 0x13, 0xC9, 0xD7, 0x3A, 0x0D, 0x90, 0xE7, 0xA8,
+  0xD4, 0xAC, 0x51, 0xAB, 0x92, 0x3E, 0xF9, 0xEB, 0xF3, 0x8D, 0x0A, 0x25, 0x75, 0xD9, 0xB9, 0xF5,
+  0xC7, 0xAE, 0x9A, 0xEE, 0x3E, 0xAC, 0xA8, 0x1F, 0xCE, 0x9E, 0x87, 0x2E, 0x06, 0x66, 0x08, 0x65,
+  0x41, 0x90, 0x37, 0x11, 0x0A, 0xB2, 0x92, 0x56, 0x2F, 0x6F, 0x8A, 0x11, 0xFB, 0x8B, 0x34, 0xB5,
+  0xFA, 0x7C, 0x1E, 0x57, 0xCF, 0x95, 0x39, 0x47, 0x95, 0xEA, 0x08, 0xF4, 0x1F, 0x5F, 0x56, 0x65,
+  0xEC, 0x01, 0xE0, 0x40, 0x76, 0x09, 0x02, 0x9E, 0xB3, 0xB8, 0x28, 0xEF, 0xEE, 0x56, 0x42, 0x65,
+  0x68, 0x53, 0x72, 0x72, 0xA1, 0xC5, 0x73, 0x66, 0xA0, 0x8C, 0xB9, 0x31, 0xE9, 0x18, 0xE4, 0x68,
+  0xC1, 0x68, 0x4C, 0x7F, 0xFB, 0xF0, 0xED, 0x59, 0x39, 0xA2, 0x73, 0xE4, 0x54, 0x13, 0x45, 0x3A,
+  0x5B, 0xA6, 0xC6, 0xC4, 0x87, 0x50, 0xB7, 0x23, 0x9E, 0x40, 0x19, 0x10, 0x91, 0xCE, 0xBA, 0xF4,
+  0xB4, 0xED, 0x66, 0x3E, 0x97, 0xBB, 0xB1, 0xAD, 0x1B, 0x6E, 0x1C, 0x1D, 0x1B, 0x88, 0x5F, 0xF7,
+  0xAC, 0x6C, 0xCF, 0xE4, 0x94, 0xE5, 0xB0, 0x69, 0x9E, 0xC3, 0x39, 0x10, 0xC5, 0x01, 0x6B, 0xD6,
+  0x0A, 0x31, 0x24, 0xFE, 0x75, 0x5D, 0xD0, 0xF9, 0x9F, 0x5E, 0xA0, 0x07, 0x10, 0x37, 0xD8, 0x34,
+  0xB9, 0x32, 0x65, 0xF2, 0x09, 0x31, 0x7C, 0x4A, 0xC0, 0x86, 0x13, 0x05, 0x37, 0xC5, 0x2D, 0x4C,
+  0xFE, 0x32, 0xC8, 0x60, 0x0F, 0x69, 0x57, 0x8B, 0xD9, 0xE9, 0x5D, 0xFC, 0x0F, 0xFC, 0xC6, 0x02,
+  0x1F, 0xC2, 0xBA, 0x79, 0x2C, 0x52, 0xC6, 0xD8, 0x9F, 0xF1, 0x33, 0x77, 0xEE, 0x48, 0xC3, 0x85,
+  0x63, 0x1E, 0xD8, 0xE7, 0x88, 0x42, 0xB2, 0xEB, 0x37, 0x37, 0x89, 0x1F, 0x3B, 0x0E, 0xF3, 0x56,
+  0x41, 0x25, 0x6E, 0xD0, 0x6D, 0x1D, 0x1F, 0x9A, 0x3B, 0x97, 0x97, 0xB5, 0x2F, 0x02, 0xAA, 0x3F,
+  0x71, 0xA4, 0xBC, 0x0A, 0xA0, 0xC7, 0xAE, 0xB8, 0xE8, 0x08, 0x7A, 0xED, 0x64, 0xEE, 0x68, 0xEF,
+  0x29, 0xC0, 0x4A, 0x07, 0xB8, 0x03, 0xAA, 0xE3, 0xE7, 0x29, 0x6B, 0xD0, 0x40, 0x6E, 0x19, 0xA4,
+  0xF5, 0x7D, 0xCB, 0x75, 0x97, 0x2F, 0x64, 0xC6, 0xC9, 0x78, 0x2E, 0x69, 0xBE, 0xBF, 0xBB, 0x10,
+  0x22, 0x76, 0x7C, 0xB1, 0xEC, 0xAA, 0x4C, 0xB3, 0x98, 0x15, 0x6C, 0xD9, 0x73, 0x5B, 0x8B, 0x73,
+  0xA4, 0x04, 0xB1, 0x67, 0xDB, 0x7F, 0x83, 0xAE, 0x77, 0xA8, 0x30, 0xB5, 0x43, 0x96, 0xCF, 0x41,
+  0x71, 0xCF, 0x3F, 0xDD, 0x36, 0x55, 0xCB, 0x8C, 0xD8, 0xDF, 0xB3, 0xCF, 0xF1, 0x14, 0xEB, 0x87,
+  0xCC, 0x6E, 0x90, 0xFE, 0xD0, 0xCF, 0x3A, 0x5A, 0x6B, 0x07, 0xE4, 0xC4, 0xB7, 0x8C, 0xA3, 0x30,
+  0xFC, 0xEC, 0x66, 0x32, 0xDB, 0x3B, 0xF6, 0x67, 0x01, 0x88, 0x73, 0xBB, 0x64, 0xFE, 0xEC, 0x2B,
+  0xE3, 0x3C, 0x6E, 0x9B, 0xA5, 0x6D, 0x22, 0xF9, 0x1C, 0x7F, 0x1C, 0x10, 0xEA, 0x16, 0xAF, 0xCF,
+  0x18, 0x68, 0x4B, 0x8C, 0x2A, 0x45, 0x83, 0xAE, 0xD8, 0x53, 0x4F, 0x73, 0xB1, 0x34, 0xCA, 0xE7,
+  0x79, 0x55, 0xBD, 0xE3, 0x38, 0x23, 0x06, 0x88, 0xBB, 0x8F, 0x5B, 0xD4, 0x30, 0x40, 0x8F, 0x7C,
+  0xD3, 0x12, 0x92, 0x85, 0x75, 0xB0, 0xA5, 0x44, 0x5B, 0xEC, 0xE7, 0x6D, 0x45, 0xBE, 0x4F, 0x81,
+  0x25, 0xEE, 0x78, 0x25, 0xC6, 0xC7, 0xBB, 0x6E, 0x8C, 0x1B, 0x21, 0xA2, 0x92, 0xA7, 0xC2, 0x0D,
+  0x14, 0x72, 0x6A, 0xFC, 0x44, 0xEA, 0xB9, 0x0E, 0xA9, 0x20, 0x1D, 0x75, 0x68, 0xCD, 0x0A, 0x43,
+  0x23, 0x9A, 0xF5, 0x7E, 0x31, 0x6E, 0x5F, 0xC8, 0x6D, 0xAD, 0xA1, 0xF6, 0x68, 0x7C, 0xB2, 0xA7,
+  0xC5, 0xAD, 0x75, 0x69, 0xD5, 0xD2, 0x34, 0x01, 0xD6, 0xC1, 0x6D, 0xBE, 0x8F, 0x69, 0xD5, 0x29,
+  0x50, 0xAE, 0x2F, 0xA4, 0x2C, 0x68, 0x96, 0x74, 0xA1, 0x28, 0xB0, 0xF0, 0x95, 0xA5, 0x78, 0xBC,
+  0xC0, 0xA6, 0xA5, 0x39, 0x95, 0x34, 0xBB, 0xE3, 0x7E, 0x9F, 0x97, 0x3D, 0xC0, 0x68, 0x1B, 0x78,
+  0x02, 0x13, 0x57, 0xCF, 0xFA, 0x68, 0xDB, 0xEE, 0x6B, 0x8D, 0x63, 0xF6, 0x20, 0x0E, 0xBF, 0x17,
+  0x50, 0xF1, 0x93, 0x6A, 0x65, 0x7E, 0x33, 0xD3, 0x70, 0x4F, 0x6A, 0xCE, 0x0E, 0xB8, 0xF0, 0xEE,
+  0x19, 0xCA, 0xA2, 0xE9, 0x90, 0x78, 0x42, 0x1A, 0x50, 0xD4, 0x86, 0xF1, 0xF5, 0x13, 0x82, 0x1A,
+  0xE4, 0x39, 0xCA, 0xB4, 0x79, 0xD6, 0x21, 0x11, 0xDE, 0xFF, 0xCB, 0x52, 0x87, 0x7A, 0x1D, 0xB8,
+  0x1A, 0xC4, 0x4B, 0x3F, 0xC9, 0xDA, 0xD8, 0xDA, 0xAD, 0x6C, 0x82, 0xD4, 0x87, 0x0D, 0x87, 0x6F,
+  0xB8, 0x52, 0x58, 0x77, 0xB3, 0xA8, 0xF5, 0xE2, 0xDF, 0x31, 0x13, 0x12, 0x5A, 0xAE, 0x3F, 0xAF,
+  0x85, 0xD8, 0xE3, 0x8E, 0xD2, 0xA3, 0x50, 0x02, 0xD3, 0x7C, 0x8A, 0x97, 0x39, 0x58, 0xF4, 0xCA,
+  0x39, 0x7D, 0x56, 0xAE, 0x60, 0xCA, 0xB5, 0xCE, 0xE0, 0x42, 0x92, 0xBA, 0x4B, 0x8F, 0x14, 0xB7,
+  0x20, 0x32, 0x9F, 0x1E, 0x9E, 0xAB, 0x1E, 0x86, 0xC2, 0xBA, 0x3A, 0xEA, 0x0F, 0x2E, 0xA7, 0x3A,
+  0x73, 0xA0, 0x9F, 0x96, 0x96, 0xF4, 0x59, 0x78, 0x19, 0x06, 0x77, 0x39, 0x6B, 0x9C, 0xFE, 0xE7,
+  0xDA, 0x55, 0x80, 0xAF, 0xD9, 0xD5, 0xA6, 0xC3, 0xE2, 0x18, 0xAA, 0xB8, 0xB0, 0x6D, 0xBB, 0xBB,
+  0x35, 0x5E, 0x6E, 0xA8, 0xD5, 0x84, 0x44, 0x24, 0xD8, 0x37, 0xE4, 0x66, 0xBA, 0xE2, 0xF7, 0xED,
+  0xF5, 0x6F, 0x93, 0x85, 0x44, 0xC5, 0xD2, 0x25, 0x11, 0x03, 0x2E, 0x43, 0x51, 0xBC, 0xB6, 0x34,
+  0xC4, 0x06, 0x3A, 0xE1, 0xB4, 0x27, 0x3A, 0x63, 0x81, 0x82, 0x79, 0xC5, 0x6D, 0x22, 0x49, 0xC8,
+  0xDA, 0xE6, 0x91, 0xC6, 0x6A, 0xB0, 0x17, 0xF0, 0x42, 0xA2, 0xD8, 0xC7, 0xA8, 0xFA, 0xFA, 0x97,
+  0xB4, 0x6A, 0x3F, 0x6F, 0x1B, 0xA6, 0xCE, 0x31, 0x9E, 0xA0, 0x7B, 0x22, 0x73, 0xE9, 0x71, 0xE5,
+  0x60, 0xBD, 0xBA, 0x73, 0x96, 0x6F, 0x2A, 0x8A, 0x2F, 0x57, 0xD8, 0xC9, 0x77, 0x44, 0xD3, 0xFA,
+  0xCF, 0xA5, 0x7E, 0x39, 0xE0, 0xA7, 0xA0, 0x58, 0x7F, 0x20, 0x6C, 0xAB, 0xD9, 0xBE, 0x9F, 0xAA,
+  0x55, 0x56, 0xDC, 0xF7, 0xF0, 0xC5, 0xCD, 0xD8, 0xA9, 0x36, 0x7E, 0xFB, 0xF8, 0x62, 0x83, 0x11,
+  0x74, 0x9A, 0xB0, 0x39, 0x8A, 0x98, 0x71, 0xAC, 0xE3, 0x07, 0x42, 0x17, 0x20, 0x7E, 0xEF, 0xDC,
+  0xEA, 0x2F, 0x64, 0x31, 0xBA, 0x08, 0x72, 0x7C, 0xD2, 0xC4, 0x88, 0xFC, 0x01, 0x99, 0xE6, 0x2F,
+  0x57, 0xB7, 0x2F, 0x72, 0x20, 0xF7, 0x8D, 0x41, 0x84, 0xCB, 0x6A, 0x67, 0x8C, 0xBD, 0x68, 0xCD,
+  0x7F, 0x34, 0x5C, 0x74, 0x11, 0x94, 0x82, 0x8F, 0x7B, 0x7B, 0x02, 0xBA, 0x9C, 0xB3, 0x0F, 0x24,
+  0x53, 0x2B, 0xAC, 0x05, 0xF3, 0x9F, 0xA7, 0x5D, 0x84, 0x61, 0x45, 0x11, 0xFF, 0x3A, 0x74, 0x0A,
+  0x94, 0x21, 0x96, 0x9E, 0x58, 0xBE, 0xD1, 0x13, 0x92, 0x09, 0x82, 0x5F, 0x7F, 0x66, 0x3B, 0x5D,
+  0x2B, 0x01, 0x24, 0x63, 0xE2, 0xD5, 0x45, 0xF1, 0x0F, 0xC0, 0x05, 0x51, 0xA3, 0x5C, 0xCF, 0xC2,
+  0x6E, 0x42, 0x03, 0x75, 0x6C, 0x22, 0x1F, 0xAB, 0x1D, 0x50, 0xAA, 0x0B, 0xF2, 0x20, 0xCB, 0x44,
+  0xD6, 0x3F, 0x2E, 0xBC, 0xA5, 0x10, 0xFF, 0x99, 0xE6, 0x31, 0x6B, 0x37, 0x4D, 0xED, 0xA7, 0x3E,
+  0xF9, 0x66, 0x5B, 0x17, 0x3F, 0xCA, 0x2B, 0x92, 0x44, 0x92, 0xD1, 0x1F, 0x56, 0x3D, 0x52, 0x6F,
+  0xAE, 0xC7, 0x67, 0x12, 0x7D, 0x0D, 0xD2, 0x37, 0x8F, 0x57, 0xC7, 0xA2, 0x10, 0xD3, 0x03, 0xD2,
+  0xBE, 0x2F, 0xE6, 0x9D, 0xC8, 0xB4, 0x4A, 0xB7, 0x7B, 0x1B, 0xC8, 0xC3, 0x1C, 0xB5, 0x9A, 0xD6,
+  0x43, 0x6F, 0xD7, 0x1B, 0x62, 0xB9, 0xAF, 0xB5, 0xEE, 0xAF, 0x5C, 0xFA, 0x87, 0xFE, 0x41, 0xD4,
+  0x5F, 0x6D, 0x3A, 0x4D, 0x8D, 0x26, 0x1E, 0x98, 0xD7, 0xD2, 0xAB, 0x4A, 0xEC, 0x2E, 0xD2, 0x25,
+  0x56, 0xA5, 0x8B, 0xFC, 0x95, 0x63, 0x81, 0x6E, 0x85, 0xD2, 0xE2, 0x01, 0xFB, 0xB0, 0xB0, 0xF4,
+  0xB1, 0x22, 0x90, 0x7B, 0x0A, 0xEF, 0xD3, 0xDA, 0xFF, 0x9E, 0xF9, 0xC2, 0xDA, 0x94, 0xC7, 0xE8,
+  0x89, 0xC1, 0x6B, 0x06, 0x3B, 0x61, 0xD6, 0x23, 0xEE, 0x56, 0x9A, 0xB3, 0x8A, 0x12, 0x1D, 0x5A,
+  0x43, 0xB4, 0xF8, 0x54, 0xE8, 0xE9, 0x1B, 0xFD, 0x28, 0x24, 0x82, 0x37, 0xF0, 0xB2, 0x3D, 0xA9,
+  0x90, 0xBB, 0xCD, 0xC7, 0xF9, 0x61, 0x68, 0xCB, 0x13, 0xC6, 0x0A, 0xF7, 0x10, 0xB2, 0xA8, 0x69,
+  0xF0, 0xDE, 0x21, 0xFB, 0x2A, 0x18, 0xD5, 0x09, 0x1D, 0xE1, 0x74, 0x22, 0x11, 0xC1, 0xAA, 0x65,
+  0xA1, 0x0C, 0x49, 0xBB, 0x0F, 0xEC, 0x0E, 0xB9, 0xCC, 0xA0, 0x3A, 0xB5, 0xB6, 0xDD, 0x25, 0x6F,
+  0xFA, 0xD7, 0xAB, 0x00, 0x47, 0x88, 0x32, 0xBF, 0x32, 0xA3, 0xA8, 0x79, 0x92, 0x73, 0x72, 0xEA,
+  0x15, 0x5D, 0x79, 0x98, 0xB1, 0xC9, 0xE2, 0x09, 0x25, 0x6E, 0x27, 0x0E, 0x57, 0x5C, 0xB8, 0xC9,
+  0x25, 0x73, 0xD5, 0x25, 0x39, 0x5D, 0x3C, 0x2A, 0xFE, 0x41, 0x94, 0xE5, 0xB3, 0xB9, 0xF8, 0x1B,
+  0xAE, 0x5D, 0x29, 0x61, 0xCE, 0x0D, 0xB1, 0xCB, 0xA1, 0x47, 0x51, 0x5F, 0x09, 0xEE, 0xC3, 0x80,
+  0x27, 0x9A, 0xE2, 0x6E, 0x40, 0xAB, 0x03, 0x92, 0xBB, 0xE9, 0x72, 0x4B, 0x3B, 0x6F, 0xE0, 0x37,
+  0x21, 0xEE, 0xC4, 0x7C, 0x69, 0xE8, 0x07, 0xCA, 0x27, 0x9A, 0xE2, 0x6E, 0x40, 0xAB, 0x03, 0x92,
+  0x53, 0xCD, 0xA4, 0x05, 0x96, 0x60, 0x67, 0xE3, 0x03, 0xBB, 0xEF, 0x1F, 0x15, 0x2E, 0x0A, 0x90,
+  0x06, 0x3A, 0xA4, 0x41, 0x10, 0x2B, 0x1C, 0x82, 0xA5, 0xAD, 0x50, 0x44, 0x61, 0x24, 0x1D, 0xA4,
+  0x6F, 0x79, 0x4D, 0xDD, 0xA1, 0xEA, 0x35, 0x0E, 0x67, 0xD1, 0x6D, 0x17, 0x26, 0xFB, 0x87, 0xD5,
+  0xC4, 0xF0, 0x0B, 0x2B, 0x97, 0x7F, 0x3F, 0x5A, 0xCC, 0x29, 0x02, 0x31, 0xCD, 0x04, 0x2A, 0x4E,
+  0x5D, 0xFF, 0x13, 0x74, 0xEF, 0x70, 0x77, 0x9D, 0xD6, 0xBD, 0x24, 0x4E, 0xC6, 0x3F, 0xC8, 0xBB,
+  0x1D, 0x78, 0x43, 0x08, 0x35, 0x53, 0x86, 0x2E, 0x55, 0x19, 0x23, 0x81, 0x03, 0xAA, 0x46, 0xA4,
+  0x8D, 0xDF, 0x88, 0x7C, 0x1B, 0xEE, 0x52, 0x1F, 0x7E, 0xD0, 0x70, 0xEB, 0x84, 0xC4, 0xE2, 0xA3,
+  0xAE, 0x7D, 0xC8, 0x89, 0x1E, 0x4A, 0x6F, 0xF8, 0xEE, 0x08, 0x70, 0x0D, 0x80, 0x8F, 0x87, 0x48,
+  0xB9, 0x18, 0x99, 0x95, 0xF6, 0xCD, 0xE5, 0xFA, 0x7D, 0x69, 0x62, 0x48, 0xFB, 0x31, 0xFB, 0xD8,
+  0x80, 0xB3, 0x95, 0x5E, 0xC0, 0xD0, 0x66, 0x0B, 0xF5, 0xBD, 0x95, 0x53, 0xB7, 0xA9, 0x92, 0x26,
+  0xD8, 0x3F, 0x66, 0x40, 0x92, 0x74, 0xF5, 0x32, 0x76, 0x3B, 0x10, 0xD0, 0x6C, 0x7C, 0xDE, 0x2B,
+  0x57, 0x60, 0xBE, 0xE6, 0xCA, 0x02, 0x66, 0xAB, 0xA9, 0x32, 0x07, 0x0A, 0xBF, 0xC3, 0xAD, 0x04,
+  0xCF, 0x35, 0xBB, 0x87, 0x26, 0x37, 0x62, 0x7E, 0xCB, 0x1F, 0xDA, 0x2E, 0xC9, 0xD6, 0xAF, 0xB6,
+  0x2F, 0xB0, 0xEE, 0x56, 0xB9, 0x0C, 0xB1, 0x39, 0x5C, 0xF8, 0x65, 0x37, 0x05, 0x70, 0x87, 0x56,
+  0x45, 0x55, 0xF4, 0xF9, 0x6D, 0x7D, 0x58, 0xAF, 0x3A, 0x60, 0x00, 0x1B, 0xA6, 0xDC, 0x0B, 0x0C,
+  0x1C, 0xE6, 0x34, 0xC5, 0xB9, 0x0A, 0x1D, 0x90, 0x04, 0xA2, 0xCE, 0x82, 0x1E, 0x6E, 0xC8, 0xF8,
+  0xDC, 0x4A, 0x52, 0xE8, 0xA6, 0x9C, 0x91, 0x89, 0xCD, 0xEB, 0x17, 0x49, 0x87, 0xB6, 0x72, 0x27,
+  0xC7, 0xD1, 0xC4, 0xB3, 0x92, 0xE2, 0x57, 0xFB, 0xAF, 0x7D, 0x33, 0xC8, 0xE8, 0x22, 0xDE, 0x74,
+  0xEB, 0xEC, 0xF0, 0xE1, 0x13, 0x8E, 0xCB, 0xC3, 0x74, 0xC7, 0x22, 0x43, 0xF6, 0xBD, 0x71, 0x2F,
+  0x46, 0x65, 0xA5, 0x25, 0x75, 0x33, 0x1E, 0xCB, 0x43, 0x7F, 0xFE, 0x20, 0xAC, 0x89, 0xB8, 0xF7,
+  0xF9, 0x41, 0xE1, 0xB6, 0xDE, 0x34, 0xE3, 0x03, 0x4D, 0x50, 0xFB, 0xB4, 0xE4, 0x25, 0xF1, 0xFB,
+  0x64, 0x98, 0x85, 0x9F, 0x67, 0xE7, 0x55, 0x41, 0x36, 0xEF, 0x06, 0x5C, 0x18, 0xBD, 0x5E, 0xEA,
+  0xCE, 0xA6, 0x8B, 0x7D, 0xE4, 0x04, 0xEF, 0x72, 0x84, 0x8A, 0x29, 0xD0, 0x1A, 0x2E, 0x69, 0xBF,
+  0xA2, 0xD4, 0x26, 0xE7, 0x87, 0x0A, 0x35, 0x1E, 0x0A, 0xCF, 0x18, 0x24, 0x94, 0xF4, 0x2B, 0xF0,
+  0x29, 0xDB, 0xBD, 0x08, 0x9B, 0x50, 0x30, 0x5F, 0x75, 0x33, 0x5B, 0xF5, 0x1B, 0xAB, 0x5D, 0x90,
+  0xB1, 0x8E, 0x1F, 0x26, 0xDA, 0x6C, 0xAE, 0x8E, 0x9D, 0x10, 0xF2, 0x2D, 0xFF, 0x3E, 0x3F, 0x85,
+  0x64, 0x14, 0x5C, 0x40, 0xC7, 0xAB, 0xDA, 0x82, 0xD4, 0x44, 0x43, 0x09, 0xBC, 0xA2, 0x8C, 0xC9,
+  0x25, 0xD5, 0x7B, 0xA8, 0x7C, 0x87, 0x00, 0x8B, 0x0B, 0xB3, 0x56, 0x4D, 0x5E, 0xB5, 0x7E, 0x1A,
+  0x5C, 0x5A, 0x79, 0x71, 0x66, 0x1C, 0xDD, 0x99, 0x14, 0x2F, 0xCB, 0xA6, 0xEF, 0x08, 0xE0, 0x31,
+  0x6E, 0x5C, 0x81, 0x38, 0x00, 0x09, 0x5B, 0xCD, 0x5E, 0x48, 0x01, 0x00, 0x95, 0x1A, 0x8F, 0xE2,
+  0x48, 0xB7, 0xD9, 0xC4, 0xB0, 0x55, 0xEB, 0x62, 0xD4, 0x48, 0x23, 0xD3, 0x51, 0x78, 0x01, 0xA9,
+  0xFD, 0x4D, 0x9E, 0xA4, 0x29, 0x14, 0x45, 0x8A, 0x42, 0x35, 0xFD, 0x8B, 0x6A, 0xAB, 0x30, 0x12,
+  0x8A, 0x18, 0x05, 0x5D, 0x2F, 0xF1, 0x04, 0x94, 0xD1, 0x0E, 0xBE, 0x7A, 0xEF, 0x82, 0x6F, 0x7E,
+  0x0C, 0xCF, 0x9F, 0x98, 0xD2, 0xDD, 0x29, 0x1A, 0x60, 0xEA, 0x73, 0xE2, 0xD8, 0xCA, 0x1D, 0x01,
+  0xF6, 0x03, 0x18, 0x62, 0x1F, 0x26, 0xC8, 0xE6, 0xFA, 0xC0, 0xCA, 0xCE, 0x3F, 0xF0, 0xB4, 0xB6,
+  0x4F, 0x93, 0xD0, 0x5C, 0xC4, 0x27, 0x11, 0xEE, 0x4B, 0x16, 0xF5, 0xEF, 0x38, 0xF4, 0x7B, 0x5B,
+  0xAB, 0x14, 0x6D, 0xD7, 0x37, 0xA5, 0x47, 0x18, 0x88, 0x71, 0x2F, 0x8E, 0xC3, 0x59, 0x31, 0x1B,
+  0x28, 0x46, 0x2E, 0xB0, 0xE6, 0x31, 0x7E, 0xDC, 0x74, 0x69, 0x20, 0xA2, 0x4C, 0xDB, 0xF2, 0xF3,
+  0x5C, 0x76, 0xAF, 0xF2, 0x28, 0xE4, 0xC5, 0x5F, 0x78, 0x47, 0x3F, 0x1A, 0x0F, 0xD1, 0x5C, 0x85,
+  0x5F, 0x35, 0x5D, 0xAA, 0x8C, 0x37, 0xFF, 0x62, 0xB6, 0xDB, 0x41, 0xD1, 0x73, 0x1C, 0xBF, 0xE8,
+  0x94, 0x9C, 0xE8, 0x37, 0xEA, 0x78, 0x00, 0x3D, 0x03, 0xB4, 0x74, 0x20, 0x1C, 0x10, 0xEB, 0xE7,
+  0x68, 0x39, 0x20, 0x46, 0x04, 0x0F, 0xB9, 0xD7, 0xF4, 0x6D, 0xA0, 0xD9, 0xD3, 0x03, 0xDC, 0x73,
+  0xA4, 0x66, 0xFA, 0xDC, 0xC1, 0xFF, 0x1C, 0x1B, 0x48, 0xD3, 0x40, 0x74, 0x17, 0xE2, 0x3F, 0x71,
+  0xBC, 0xA4, 0xC6, 0x24, 0x67, 0x6D, 0xC8, 0x18, 0x9F, 0xB5, 0xA8, 0xD1, 0x47, 0xAF, 0xB3, 0xB7,
+  0x57, 0x41, 0x9B, 0x0D, 0x2B, 0xD5, 0xE6, 0x59, 0xCD, 0xCF, 0x66, 0x1E, 0xAF, 0xB2, 0x2F, 0xA8,
+  0xF4, 0x82, 0xAA, 0xDE, 0x49, 0xFD, 0x88, 0x6C, 0xF9, 0x72, 0xAB, 0x45, 0xE9, 0xCF, 0x04, 0xF5,
+  0x43, 0x41, 0xE2, 0x00, 0xB7, 0xD9, 0x7F, 0xFB, 0x9C, 0x9F, 0x2F, 0xDD, 0xE5, 0x2A, 0xCC, 0x7A,
+  0x41, 0x99, 0x7E, 0x4C, 0x88, 0xE5, 0x10, 0x22, 0xFF, 0xD3, 0x60, 0xFC, 0x1D, 0x67, 0xCC, 0x7B,
+  0x6E, 0x6E, 0x23, 0xFA, 0xB6, 0xC9, 0x72, 0x7F, 0x9E, 0x6B, 0xF5, 0xF6, 0xD3, 0x0B, 0x01, 0x9E,
+  0xBE, 0xE4, 0x9B, 0x5D, 0x01, 0x8F, 0x97, 0x17, 0x8C, 0x31, 0x02, 0x2B, 0x25, 0x21, 0x20, 0x56,
+  0x86, 0xF6, 0x75, 0xC3, 0xBF, 0x3D, 0xE9, 0x71, 0xF2, 0x96, 0x4D, 0x51, 0x18, 0xF0, 0x4A, 0x12,
+  0x2B, 0xCF, 0xBC, 0x44, 0xCC, 0x71, 0x36, 0x73, 0x23, 0xBA, 0x47, 0xD7, 0xBF, 0x8C, 0x4D, 0xE3,
+  0x4A, 0xD3, 0x62, 0xC6, 0x32, 0x34, 0xB8, 0xD7, 0xE3, 0x1E, 0x3E, 0x76, 0x7F, 0x8C, 0x0D, 0x8D,
+  0x33, 0x16, 0xC1, 0x9C, 0xEE, 0xCB, 0xBE, 0xC4, 0x6D, 0x6B, 0x6A, 0x9E, 0x25, 0x0C, 0x7B, 0xB3,
+  0x83, 0xC2, 0xD3, 0x8F, 0xBF, 0x17, 0xE8, 0xBF, 0x5B, 0x17, 0x95, 0x3A, 0xA8, 0x4D, 0x7A, 0x09,
+  0x8D, 0x89, 0x0D, 0x9B, 0xC4, 0x75, 0xA8, 0xAB, 0xB6, 0xA1, 0xBB, 0x22, 0x33, 0x14, 0x0A, 0x77,
+  0x1B, 0x04, 0x40, 0x8E, 0x51, 0x2B, 0x0E, 0x3F, 0xDE, 0x8C, 0x3D, 0x33, 0x13, 0xEF, 0x68, 0x3B,
+  0xB7, 0x85, 0xC7, 0x33, 0xC0, 0x02, 0x98, 0xF0, 0x73, 0xF5, 0xA2, 0x45, 0x31, 0x0A, 0xC6, 0x3D,
+  0x2A, 0x40, 0x62, 0x3E, 0x64, 0xC5, 0x60, 0x65, 0xD0, 0x37, 0x8C, 0xE9, 0xE0, 0xF4, 0xFC, 0xB4,
+  0x29, 0x87, 0x37, 0x5D, 0xD2, 0x00, 0xAF, 0x28, 0xE5, 0x53, 0x40, 0xD5, 0xD6, 0x11, 0x35, 0x18,
+  0xE1, 0xEF, 0xA2, 0x6D, 0x21, 0xC4, 0x78, 0x6C, 0x8B, 0xC8, 0xD9, 0xF0, 0x26, 0xD4, 0x71, 0x6D,
+  0x4F, 0x35, 0x1C, 0x5D, 0x1F, 0xAD, 0xA2, 0x99, 0xEF, 0x40, 0x54, 0xA0, 0x38, 0x3A, 0xC2, 0x4B,
+  0x35, 0xBF, 0x24, 0xD3, 0xB2, 0x7E, 0x3C, 0x5E, 0x3F, 0x04, 0x2D, 0xC3, 0x06, 0x35, 0x9C, 0x4B,
+  0x3E, 0x09, 0x98, 0x67, 0x05, 0x51, 0x4E, 0xC6, 0xF3, 0x43, 0x64, 0xDB, 0x1C, 0x87, 0xD9, 0x3D,
+  0xFA, 0x94, 0xE1, 0x83, 0xE7, 0xD2, 0xE1, 0x06, 0xFA, 0x5A, 0x94, 0x30, 0xCB, 0x4B, 0x7F, 0xCB,
+  0x2F, 0x44, 0xA7, 0x64, 0x06, 0xD6, 0x18, 0xE9, 0x65, 0x2B, 0xE0, 0x8C, 0x00, 0x50, 0x55, 0x0C,
+  0xCC, 0x41, 0x5D, 0x2B, 0x5F, 0xB2, 0xE7, 0xA8, 0x8B, 0x4A, 0xA8, 0x50, 0x67, 0xA4, 0xD4, 0x60,
+  0x38, 0x06, 0x4C, 0x82, 0x26, 0x81, 0x3E, 0x25, 0x2E, 0x8C, 0x8A, 0x74, 0x7C, 0xFA, 0xF6, 0x6F,
+  0x4A, 0xE8, 0x1F, 0x86, 0xEE, 0x9B, 0xEF, 0xAF, 0x89, 0x30, 0xE4, 0xE4, 0x75, 0x1F, 0xDF, 0xE8,
+  0xEA, 0x5B, 0x8B, 0xAE, 0xA3, 0x94, 0xD0, 0xEB, 0xDE, 0xEF, 0x36, 0x7C, 0xB5, 0x23, 0x3E, 0xA9,
+  0x0E, 0xB6, 0x3B, 0x75, 0xEF, 0x16, 0x95, 0xD2, 0x44, 0xBD, 0xAB, 0x86, 0x87, 0x7E, 0xEE, 0xF3,
+  0xC8, 0x11, 0x5B, 0x5F, 0xD6, 0x2B, 0x2C, 0x65, 0xB0, 0x16, 0x3B, 0xD6, 0x23, 0x4E, 0x3A, 0x85,
+  0x2A, 0x5A, 0xEE, 0x7D, 0xA4, 0x60, 0x5C, 0xDD, 0xF9, 0xE9, 0xE3, 0x55, 0x71, 0x12, 0xD6, 0x9D,
+  0x47, 0xD8, 0x31, 0x27, 0xDE, 0xEA, 0xBD, 0x29, 0xE8, 0x6E, 0x1D, 0x45, 0xD5, 0xB2, 0xEB, 0x12,
+  0xC9, 0x4E, 0xCA, 0xDD, 0xDE, 0xD3, 0x15, 0xAF, 0x9D, 0x48, 0xFF, 0x31, 0x2D, 0x94, 0x3C, 0x5A,
+  0x93, 0xA9, 0xFC, 0x99, 0xF4, 0x55, 0xD3, 0xC0, 0xF6, 0x84, 0xD9, 0xEE, 0xA2, 0x46, 0xC2, 0x1B,
+  0x5E, 0x25, 0x0B, 0x20, 0x56, 0x12, 0xA3, 0xBF, 0x26, 0xC5, 0x12, 0x1C, 0x6C, 0x10, 0x16, 0x65,
+  0xD3, 0x72, 0x20, 0xC9, 0xF4, 0xAC, 0x89, 0x29, 0xFA, 0x22, 0xEB, 0x40, 0xC2, 0xBA, 0xF5, 0x91,
+  0x50, 0x70, 0xCE, 0x27, 0x0C, 0x53, 0x2D, 0xE4, 0xFA, 0xEE, 0xFA, 0xEC, 0xC2, 0xB5, 0x85, 0xBB,
+  0xB5, 0x3A, 0x97, 0x6B, 0xE8, 0x18, 0xAE, 0xA0, 0x67, 0xA6, 0xA4, 0x45, 0x8C, 0xD9, 0xED, 0x90,
+  0xAD, 0x35, 0x69, 0xF8, 0x13, 0x5E, 0x1A, 0xD1, 0x35, 0x8D, 0xEA, 0x1F, 0x53, 0xD8, 0x86, 0x73,
+  0x6C, 0x2A, 0xCB, 0x74, 0xA4, 0x2D, 0xA2, 0x65, 0x54, 0xE2, 0x29, 0x6D, 0x24, 0xA5, 0x4B, 0x6F,
+  0xFE, 0x12, 0xE7, 0x84, 0xCF, 0xF7, 0x5D, 0xC8, 0xB5, 0x20, 0x36, 0x25, 0x28, 0xE4, 0x69, 0x11,
+  0x8C, 0x79, 0xAB, 0x46, 0x53, 0x06, 0x7E, 0x1D, 0x93, 0x86, 0xEA, 0x8F, 0x03, 0xD1, 0x51, 0x4D,
+  0x9C, 0x73, 0x40, 0x59, 0xC8, 0x66, 0x7B, 0xC6, 0xA0, 0x25, 0x35, 0xF1, 0x03, 0x1B, 0xC7, 0xC5,
+  0xB7, 0xF5, 0x28, 0x8A, 0xF7, 0x75, 0x10, 0x7D, 0xE4, 0xE7, 0xE3, 0x82, 0xBE, 0x35, 0x67, 0x23,
+  0xB7, 0x65, 0xBF, 0xE1, 0x89, 0x5E, 0xEF, 0x1C, 0xF6, 0x17, 0x37, 0xB1, 0x95, 0x13, 0x9C, 0x8A,
+  0x69, 0x8C, 0x16, 0x85, 0x66, 0x27, 0x9A, 0xBC, 0xC3, 0x8A, 0xF3, 0xF9, 0xA2, 0xD3, 0x5E, 0xB5,
+  0x87, 0x06, 0xC8, 0x4B, 0x0F, 0x48, 0x32, 0x13, 0xF1, 0xC3, 0xDD, 0x81, 0x24, 0xF8, 0x57, 0xA1,
+  0xCE, 0xDF, 0xEB, 0x72, 0x46, 0x04, 0x6F, 0x6B, 0x6B, 0x4E, 0xC3, 0x2A, 0x84, 0x98, 0x7D, 0x05,
+  0x1F, 0x0B, 0x2A, 0x7E, 0xD6, 0x3B, 0xC0, 0xA6, 0x5C, 0xDF, 0xC1, 0x3B, 0xF8, 0xEB, 0x7F, 0xE6,
+  0x2A, 0x6B, 0xFB, 0xA7, 0x35, 0xEE, 0xFB, 0x53, 0xC9, 0x77, 0x32, 0x46, 0xE7, 0xAD, 0xC8, 0x77,
+  0xFB, 0x06, 0x86, 0xD4, 0xA4, 0x74, 0x2F, 0xA4, 0x77, 0xAC, 0xA8, 0x9B, 0x71, 0x0D, 0x02, 0x2A,
+  0x54, 0x7A, 0x86, 0x71, 0x75, 0xBE, 0xB2, 0xB8, 0x39, 0xE5, 0xC0, 0x64, 0x87, 0x30, 0x4A, 0xC1,
+  0xAF, 0x32, 0xA3, 0x02, 0x93, 0xB3, 0x0F, 0xAC, 0x53, 0xBB, 0xEE, 0x88, 0xF6, 0xCD, 0x05, 0xF9,
+  0xAC, 0xFE, 0xE0, 0xAB, 0x9A, 0x70, 0x59, 0x07, 0x6E, 0x6B, 0x7E, 0xB0, 0x76, 0xD4, 0x2A, 0x4E,
+  0x92, 0xE9, 0xE1, 0xDA, 0xF6, 0xBC, 0x91, 0x03, 0x0D, 0x3F, 0xEE, 0x8A, 0xD0, 0x72, 0x54, 0xB3,
+  0x92, 0x38, 0x0D, 0x36, 0xEE, 0x94, 0x72, 0x8A, 0x47, 0xD2, 0x6B, 0xA4, 0xE0, 0x73, 0xE3, 0x1C,
+  0x56, 0x94, 0x9F, 0xD0, 0x48, 0x87, 0x0F, 0x77, 0x02, 0xF6, 0x27, 0xC1, 0x21, 0x12, 0xE8, 0xE8,
+  0xF0, 0x32, 0xD8, 0x5D, 0x85, 0x0E, 0x22, 0x47, 0xA2, 0xDF, 0x79, 0x4E, 0xA8, 0xA8, 0xCB, 0x4D,
+  0xD6, 0x4A, 0x8B, 0xA6, 0x35, 0xD3, 0x1B, 0xDE, 0x98, 0xD3, 0x8A, 0x92, 0x81, 0x68, 0xAE, 0x82,
+  0xF9, 0x72, 0x98, 0x92, 0x84, 0x0C, 0x7C, 0x75, 0x50, 0x0B, 0x50, 0x31, 0xD4, 0x68, 0xD4, 0x06,
+  0x93, 0x61, 0xAC, 0xF3, 0x98, 0x4C, 0xE3, 0x21, 0x30, 0x0E, 0x99, 0x13, 0x8D, 0x8E, 0x03, 0xC9,
+  0x79, 0x4F, 0x93, 0x37, 0x02, 0x5A, 0x25, 0x70, 0x1F, 0x06, 0x3D, 0x91, 0x2F, 0x73, 0x15, 0xBF,
+  0x63, 0x0F, 0x7A, 0x22, 0x5B, 0x5B, 0xFA, 0x7A, 0xCD, 0x86, 0xDC, 0xC0, 0xB7, 0x5C, 0xA8, 0xBF,
+  0x3C, 0xE4, 0xBF, 0x99, 0x13, 0xBC, 0x6C, 0xE2, 0x07, 0x3A, 0x2E, 0x4F, 0xD0, 0xEE, 0xB3, 0x6C,
+  0x86, 0x44, 0xC9, 0x6F, 0x3A, 0x0E, 0xC5, 0x5F, 0x84, 0xD4, 0x2A, 0x8F, 0x97, 0xA5, 0x56, 0x83,
+  0x64, 0xB7, 0x2B, 0x21, 0x70, 0x71, 0x1A, 0x63, 0xD4, 0x0E, 0xF0, 0xD9, 0x83, 0x0F, 0x7D, 0xE4,
+  0x23, 0xDD, 0x59, 0x19, 0x51, 0x58, 0xD2, 0x8A, 0x6C, 0x77, 0x4A, 0x87, 0xBD, 0x72, 0xCB, 0xB3,
+  0xB4, 0x15, 0x42, 0x60, 0x84, 0x16, 0x53, 0x2A, 0x26, 0x2C, 0x1D, 0x83, 0x9B, 0x78, 0x67, 0xE6,
+  0x4E, 0x49, 0x31, 0x14, 0x98, 0xF5, 0x95, 0xB3, 0x9F, 0x3F, 0x3F, 0x77, 0x2B, 0xBB, 0x26, 0x7B,
+  0xB0, 0xE7, 0x1A, 0x93, 0xE8, 0x23, 0xFD, 0x3D, 0x87, 0x0A, 0xB3, 0x03, 0x4F, 0x9D, 0x07, 0x7F,
+  0xF6, 0x94, 0xD9, 0xEB, 0x44, 0xA3, 0xA5, 0x8A, 0x9D, 0x63, 0x1C, 0x29, 0xE9, 0x6F, 0x8E, 0x7A,
+  0x05, 0x1F, 0xB5, 0x60, 0xD7, 0x1C, 0x88, 0xCA, 0x27, 0x9E, 0xD6, 0x92, 0x0B, 0xA3, 0x1E, 0x3E,
+  0x4E, 0x07, 0xD4, 0x0F, 0x1C, 0x2A, 0xDD, 0xB1, 0x1A, 0x15, 0x08, 0x69, 0xAE, 0x4E, 0xAE, 0xD9,
+  0xD2, 0xE8, 0x8F, 0xD9, 0x78, 0xEE, 0x37, 0x0B, 0xF3, 0x43, 0xBA, 0xC7, 0xC2, 0x03, 0xDE, 0xEE,
+  0xA7, 0xBE, 0x87, 0xF6, 0x56, 0x4B, 0x0B, 0xD6, 0xAC, 0xE0, 0x8D, 0xC3, 0x41, 0xA2, 0x81, 0xD1,
+  0x6C, 0x04, 0x04, 0x60, 0xCC, 0x40, 0xAB, 0xAA, 0xCB, 0x24, 0x60, 0xB9, 0xFC, 0xC3, 0x7D, 0x0A,
+  0xFF, 0x5F, 0x3E, 0xF2, 0x72, 0x16, 0xD7, 0xF4, 0x79, 0xCB, 0x1D, 0x29, 0x23, 0xF5, 0xF4, 0x90,
+  0xAB, 0x40, 0xCA, 0x22, 0x8C, 0xC2, 0x88, 0x48, 0x1C, 0xB8, 0x78, 0x50, 0x3B, 0x81, 0xF0, 0x67,
+  0x8B, 0x3F, 0xA5, 0x0B, 0x1D, 0xDA, 0xC1, 0x8C, 0x12, 0x67, 0x67, 0x1E, 0x4D, 0xCB, 0x75, 0x74,
+  0x4B, 0x7D, 0x1D, 0x40, 0xE6, 0x55, 0x14, 0xAD, 0x42, 0x16, 0xC0, 0x73, 0xA2, 0x6C, 0xA0, 0x15,
+  0xE6, 0xC3, 0xE8, 0x59, 0xA0, 0x28, 0xFE, 0x51, 0x34, 0x80, 0xE3, 0xD3, 0x0C, 0xD0, 0x82, 0x8E,
+  0xD2, 0x60, 0xE6, 0x84, 0xE8, 0x7F, 0xDF, 0x2A, 0xD2, 0x6D, 0x00, 0xCE, 0xE4, 0xBE, 0x71, 0xF4,
+  0xF4, 0x8D, 0x33, 0x1D, 0x99, 0xC4, 0x12, 0x16, 0x5F, 0x51, 0x38, 0xD4, 0xA7, 0xCD, 0x6B, 0x3D,
+  0xF1, 0xEC, 0x36, 0x97, 0x14, 0x11, 0x00, 0x90, 0xE8, 0x78, 0x91, 0xBF, 0x07, 0xFF, 0x70, 0x8D,
+  0x58, 0xA5, 0xC5, 0xF7, 0x33, 0x9D, 0xF8, 0x43, 0x0F, 0xC3, 0x76, 0x3B, 0x8B, 0x0A, 0x78, 0xA4,
+  0xA0, 0x62, 0x7D, 0xE8, 0x8C, 0x4E, 0xFF, 0xCB, 0xA7, 0x2C, 0x17, 0xF4, 0xF3, 0xB0, 0x15, 0x28,
+  0x58, 0xB9, 0x98, 0xBA, 0xE5, 0x1C, 0x16, 0xD6, 0xD5, 0x05, 0x3C, 0xB6, 0x53, 0x02, 0xA2, 0xAE,
+  0xD5, 0xD0, 0x68, 0xF3, 0xD5, 0x06, 0x08, 0x7E, 0xEC, 0xF7, 0xFC, 0xF4, 0xB9, 0xB9, 0x31, 0x03,
+  0x4C, 0x3B, 0x82, 0xA5, 0x94, 0xA7, 0x8E, 0x74, 0x0A, 0x7D, 0x96, 0xCD, 0xD9, 0x9A, 0xB0, 0x33,
+  0xFC, 0x41, 0xD0, 0x26, 0xAF, 0x53, 0xB9, 0xEE, 0x75, 0xFA, 0x83, 0xBC, 0xF5, 0x30, 0x93, 0xB4,
+  0x07, 0x4C, 0x6D, 0x80, 0x8D, 0xE5, 0xDF, 0x34, 0x3B, 0xBA, 0xC1, 0x4F, 0x1B, 0xA6, 0x56, 0x9D,
+  0x2C, 0x99, 0xE3, 0x9A, 0xF1, 0x03, 0xAE, 0x19, 0x5E, 0x54, 0x33, 0x2E, 0xC5, 0xCF, 0x16, 0x14,
+  0x2E, 0x56, 0x35, 0x06, 0xFE, 0x88, 0x38, 0x43, 0x09, 0x14, 0xF4, 0xFB, 0x04, 0x31, 0x72, 0x72,
+  0x05, 0x9E, 0xC1, 0xDE, 0x1F, 0x26, 0xB2, 0x4B, 0x18, 0xCF, 0x1F, 0x4B, 0x90, 0x3A, 0x08, 0x15,
+  0xBF, 0xAD, 0x40, 0x4C, 0x58, 0x28, 0x76, 0x41, 0xDE, 0xBB, 0x75, 0xE9, 0x5D, 0xA1, 0x5A, 0xE8,
+  0xE8, 0x70, 0x1D, 0x44, 0xE8, 0x66, 0xF8, 0x20, 0x1B, 0x00, 0x77, 0x82, 0x01, 0xEB, 0xBC, 0xC3,
+  0xB3, 0x8D, 0x36, 0xDC, 0x9D, 0x2A, 0x2A, 0x08, 0x71, 0x80, 0xD8, 0x6B, 0xB9, 0x54, 0xEE, 0x58,
+  0xA0, 0x08, 0x63, 0xEC, 0x55, 0xC6, 0xB3, 0xF5, 0x9B, 0x89, 0x0E, 0x16, 0x38, 0xAF, 0xFF, 0xF7,
+  0x3E, 0x33, 0xC5, 0x56, 0x09, 0x89, 0xE2, 0x7A, 0xBF, 0xA2, 0x51, 0xEE, 0x03, 0x30, 0x49, 0xBE,
+  0x32, 0xA3, 0x24, 0xE5, 0x5B, 0x0E, 0x95, 0x81, 0x9C, 0x58, 0x81, 0x40, 0xAD, 0x80, 0x35, 0xBC,
+  0xA3, 0xE0, 0x84, 0x26, 0x9D, 0xC3, 0x74, 0x97, 0x0F, 0x52, 0x1D, 0xDB, 0x4D, 0x7F, 0x26, 0xDE,
+  0x9A, 0xF9, 0xF4, 0x00, 0x85, 0x01, 0x7B, 0xF5, 0xBA, 0xE4, 0x47, 0xF7, 0x6A, 0xA5, 0x08, 0x2A,
+  0xAD, 0x70, 0xAE, 0x6E, 0x7A, 0x47, 0x9E, 0xEA, 0xAC, 0x56, 0x60, 0xA7, 0x9E, 0x77, 0x44, 0xAE,
+  0x68, 0x5F, 0xC4, 0x6B, 0xB2, 0xD6, 0xA3, 0xA6, 0xE6, 0x5E, 0x7E, 0xDE, 0x3B, 0x9D, 0x7F, 0xDD,
+  0x8D, 0x9A, 0x0B, 0x73, 0x3F, 0x17, 0xBA, 0xFE, 0xF2, 0x5E, 0x6E, 0xEC, 0x5C, 0x0D, 0xE1, 0x3A,
+  0x4D, 0x8C, 0x00, 0xE1, 0xD4, 0xC1, 0xA5, 0xA2, 0xDB, 0x06, 0x9F, 0xC5, 0x4C, 0x4B, 0x75, 0x55,
+  0x30, 0x0E, 0x1E, 0x8D, 0x01, 0x56, 0x56, 0xFD, 0x63, 0x3B, 0xAA, 0x94, 0xCC, 0xE8, 0x9E, 0xBD,
+  0xBA, 0xDA, 0x39, 0xA8, 0xF2, 0x02, 0x1A, 0xEB, 0x45, 0xB4, 0x30, 0xEE, 0x45, 0x8E, 0xEA, 0x29,
+  0xB9, 0x01, 0x7D, 0x11, 0xCC, 0xD4, 0xE8, 0x36, 0x0C, 0x44, 0xB8, 0x47, 0x90, 0x3E, 0x42, 0x75,
+  0x95, 0x3C, 0x2C, 0x94, 0xC5, 0xDA, 0xF2, 0x26, 0x1B, 0x47, 0x02, 0x6F, 0x98, 0x9F, 0x1C, 0x4F,
+  0x06, 0x95, 0x57, 0xC4, 0x08, 0x39, 0x21, 0x4A, 0x10, 0x6B, 0xBF, 0xD9, 0x7C, 0x63, 0xE5, 0x90,
+  0x9D, 0xAB, 0x7E, 0x1E, 0x7F, 0x5D, 0x26, 0xB1, 0x55, 0x9A, 0x72, 0x0B, 0x6F, 0x43, 0x0D, 0x7E,
+  0x3E, 0x1F, 0xBD, 0x9C, 0x2F, 0xC4, 0x7D, 0xDA, 0xB4, 0x0E, 0x98, 0xAA, 0x58, 0xDB, 0x26, 0xEF,
+  0xCA, 0xC8, 0x02, 0xBE, 0x9D, 0xA6, 0x97, 0x56, 0x27, 0xF6, 0x40, 0xAA, 0x23, 0x26, 0x16, 0xE9,
+  0x7E, 0xF0, 0x8F, 0x5B, 0xAA, 0xF3, 0x2C, 0x0D, 0x2E, 0xD8, 0xDE, 0xD3, 0xCF, 0x8A, 0x9E, 0xF8,
+  0x3C, 0x63, 0xAE, 0x41, 0xF3, 0xB8, 0x5D, 0xE3, 0x2F, 0x4A, 0x4F, 0xE3, 0xEC, 0x1F, 0x6A, 0x89,
+  0x49, 0x68, 0xAE, 0xAB, 0x8D, 0x25, 0xA5, 0xBD, 0xEE, 0x47, 0x77, 0x38, 0x7B, 0x0A, 0x00, 0xC4,
+  0xD4, 0x47, 0xA3, 0xA3, 0xAD, 0x86, 0x8B, 0x2F, 0x61, 0x81, 0x8D, 0x75, 0x31, 0xFD, 0xAA, 0x2C,
+  0xEB, 0x89, 0xCE, 0x46, 0xAF, 0x58, 0xFF, 0x5C, 0xE0, 0x20, 0x83, 0xA8, 0xF8, 0xC6, 0xB2, 0x4D,
+  0x7C, 0xD8, 0x0A, 0x3D, 0x34, 0xA9, 0x0F, 0x41, 0xF3, 0x7B, 0x24, 0xBF, 0xEE, 0xE8, 0x7D, 0x60,
+  0x62, 0x24, 0x31, 0x23, 0xF8, 0xD3, 0xFE, 0xB6, 0xEC, 0xA5, 0xEB, 0xD3, 0x29, 0x5C, 0x60, 0x6A,
+  0x82, 0x45, 0xC4, 0x93, 0x67, 0x97, 0x24, 0x8E, 0xB7, 0xCF, 0xAA, 0x7A, 0x49, 0x1D, 0xFC, 0x91,
+  0xFD, 0x4C, 0xDB, 0x15, 0x11, 0xE2, 0x0D, 0x9A, 0x00, 0x84, 0xD5, 0x67, 0x92, 0xDB, 0xE3, 0x6F,
+  0x7A, 0xA6, 0xCD, 0xF4, 0xEA, 0xEF, 0x8A, 0x59, 0xA5, 0x58, 0xD5, 0x64, 0x9A, 0x96, 0x1A, 0x9E,
+  0x47, 0xF8, 0x7A, 0xC2, 0x2F, 0x28, 0x3D, 0xBF, 0x75, 0x83, 0xCF, 0x91, 0xE7, 0xE0, 0xB4, 0xEA,
+  0x7B, 0xBA, 0xA0, 0x9C, 0x93, 0xC2, 0x62, 0xAA, 0x5F, 0x3E, 0x92, 0xD2, 0x9A, 0x42, 0xE2, 0xCB,
+  0xED, 0xC3, 0x62, 0x65, 0xC5, 0x90, 0xF5, 0x5F, 0x96, 0x4E, 0xC1, 0x37, 0x75, 0x19, 0xEA, 0x96,
+  0x93, 0xF9, 0xBA, 0x72, 0x23, 0x39, 0xC5, 0xDF, 0xEF, 0xC9, 0xC2, 0xA2, 0x8A, 0x75, 0xCF, 0xA1,
+  0xD2, 0xC3, 0x2E, 0xC1, 0xDB, 0xA7, 0xDF, 0x49, 0xBB, 0x56, 0xEA, 0x21, 0x11, 0x4C, 0xCA, 0xA2,
+  0x8C, 0xA8, 0x81, 0xF8, 0x2E, 0xCB, 0x1E, 0xDD, 0x09, 0x71, 0x9D, 0xA4, 0x1A, 0x4C, 0x21, 0xDA,
+  0xBC, 0xA6, 0x70, 0xD4, 0x22, 0x51, 0x19, 0xEA, 0x01, 0x67, 0xBB, 0x01, 0x26, 0xFD, 0x64, 0xCD,
+  0x1D, 0x32, 0xB4, 0xFE, 0x3E, 0x73, 0xA4, 0x26, 0x89, 0x9A, 0x77, 0x58, 0x84, 0x1A, 0xCD, 0x02,
+  0xDD, 0x59, 0xEF, 0xBB, 0xB4, 0x29, 0x1C, 0xDB, 0x9D, 0xF9, 0x5C, 0x81, 0x2C, 0x46, 0x75, 0x7E,
+  0xAB, 0x17, 0x7A, 0x1C, 0x49, 0x84, 0x57, 0xCF, 0x87, 0xC2, 0x5E, 0xEC, 0x24, 0x46, 0x20, 0xFA,
+};
+
+#endif
\ No newline at end of file
diff -r 0e8f5bf68b50 -r cf658680c53f CCS811_FW_App_v2-0-0.bin
Binary file CCS811_FW_App_v2-0-0.bin has changed